为什么这个"自动"不会自动变成"`const`"

Why does this `auto` not automatically turn into "`const`"

本文关键字:const 自动 为什么      更新时间:2023-10-16

可能重复:
c++11 中的自动参考

我学习C++的次数越多,我就越意识到到到目前为止(几乎;见下文(它中的一切基本上都是有意义的。我发现我真的不必背任何规则,因为一切都如预期。因此,主要的事情变成了真正理解这些概念,然后剩下的就自己处理了。

例如:

const int ci = 0;
auto &a = ci;       //automatically made const (const int &)

这是有效的,也是有道理的。a类型的任何其他东西都是荒谬的。

但现在就拿这些:

auto &b = 42;       //error -- does not automatically become const (const int)
const auto &c = 42; //fine, but we have to manually type const

为什么第一个是错误?为什么编译器没有自动检测到这一点?为什么必须手动键入const?我想真正理解为什么,在一个基本的层面上,让事情有意义,而不必记住任何严格的规则(见上文(。

42的类型是int,而不是const int

C++11中的auto关键字的行为非常接近模板类型推导的工作方式(返回概念方法(。如果你根据模板参数推导来说明类型推导,它会变得更明显(我相信(:

template <typename T>
void f(T);
template <typename T>
void g(T&);
const int i;
f(i);              --> T deduced to be int
g(i);              --> T deduced to be const int

基本上,您正在创建一个用现有变量初始化的新变量。从中复制的原始对象的常数与目标对象的常数正交。