const int ci = 10;
auto i = ci; // i will be "int" instead of "const int"
i = 20;
我想知道为什么auto是针对这种行为设计的?
为什么类型i是" int"而不是" const int" ?
这里有什么问题?
我认为理解为什么会帮助我们记住它
答案 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不是价值的一部分。 const
是int
,无论是使用文字,命名常量,表达式还是非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
但是, 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
类型,否则会允许非法修改。