4

可能重复:
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必须手动输入?我想从根本上真正理解为什么,这样事情才有意义,而不必背诵任何严格的规则(见上文)。

4

2 回答 2

12

的类型42int,不是const int

于 2013-01-16T15:29:02.983 回答
3

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

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

于 2013-01-16T15:32:52.887 回答