为什么auto i = same_const_variable无法演绎" const"?

时间:2015-08-21 00:54:03

标签: c++ c++11 auto type-deduction

const int ci = 10;
auto i = ci;  // i will be "int" instead of "const int"
i = 20;

我想知道为什么auto是针对这种行为设计的?

为什么类型i是" int"而不是" const int" ?

这里有什么问题?

我认为理解为什么会帮助我们记住它

2 个答案:

答案 0 :(得分:6)

auto主要遵循与模板参数推导相同的类型推导规则。唯一的区别是auto在某些情况下会从 braced-init-list 中推断出std::initializer_list,而模板参数推断则不会这样做。

来自N3337,§7.1.6.4[dcl.spec.auto]

  

6 ...然后是为变量d推导出的类型   使用函数调用(14.8.2.1)中的模板参数推导规则确定的推导A,...

您正在观察的行为与从函数调用中推导类型时的模板参数推导相同

§14.8.2.1[temp.deduct.call]

  

2如果P不是参考类型:
   - ......
   - 如果A是cv限定类型,类型扣除会忽略A类型的顶级cv限定符

因此,在

auto i = ci;

忽略顶级const限定符,i推导为int

写作时

auto& i = ci;

然后i不再是引用类型,并且上述规则不适用,因此保留const限定符。

答案 1 :(得分:4)

e.Row.Cells(0).Controls.Add(toggle)本身意味着您需要一个具有给定值副本的新的本地拥有变量。 auto - ness不是价值的一部分。 constint,无论是使用文字,命名常量,表达式还是非int变量指定的。{/ p>

const

要获得推断类型的常量,您仍然可以使用auto i = 3, j = i, k = ci, m = 3 + 4; // All these variables are type int. 。这在声明中表达了如何使用变量。

auto const

从C ++ 14开始,还有const auto i = 3; 说明符,它将decltype(auto)应用于初始化程序,以制作给定变量的副本。也许这真的是你的期望:

decltype

Live demo

但是,

decltype(auto) i = ci; // i receives type const int. 有点棘手,除了与决定函数调用包装器的返回类型有关的最初目的之外,它几乎没有用例。除非有充分理由,否则请选择decltype(auto)const auto

另一种方法是使用拼写为const int转发参考。这指的是初始化它的变量或值,无论它是什么。

auto &&

这不具有表现力和特异性,但可靠地将auto && i = ci; // i receives type const int & and aliases ci. 声明为i的别名。您尝试的另一件事是ci,它类似但只允许形成对预先存在的变量的引用。

auto &

auto & i = ci; // i receives type const int & and aliases ci. 变量的引用必须是const int类型,否则会允许非法修改。