为什么这个"自动"不会自动变成"`const`"
Why does this `auto` not automatically turn into "`const`"
可能重复:
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
基本上,您正在创建一个用现有变量初始化的新变量。从中复制的原始对象的常数与目标对象的常数正交。