以下是代码示例。
a. int ii = 0;
b. const int ci = ii;
c. auto e = &ci; --> e is const int *
d. auto &f = 42; --> invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’
e. const auto &g = 42 --> ok观察:
对于子句c)类型const是自动推导的;对于子句d)类型const不是自动推导的;对于子句e)必须手动添加类型const才能使其工作。
为什么为子句c自动推导出const类型,而不是d?
发布于 2015-10-01 03:09:36
原因不是常量,而是r-值。
您不能接受对r值的非常数引用。
如果你想知道什么是r值,最初的想法是只能在赋值的右边。
为了获取一个编译时间常量的地址,编译器首先复制它,然后给你这个地址。要启用该行为,引用必须显式为const。
要完成答案: case
ci的类型为const int,因此&ci的类型为const int.42的类型为int。auto推断为int,f声明为对int的引用,但未能绑定到r值g的类型为const int &,可以绑定到编译时间常数。发布于 2015-10-01 03:22:02
这是因为42的类型不是const int,而是int。它是一个右值,这意味着它不能绑定到左值引用(除非它是对const的引用),但它仍然是int类型。这就是auto的推论。
如果你用ci而不是42来尝试它,你会发现它是works
auto &e = ci;发布于 2015-10-01 03:21:43
在……里面
auto &f = 42;42的类型是int,所以auto &f变成了int &f。现在42是一个编译时文字,因此它是一个r值。我们不能将r值绑定到引用上,所以你会得到一个编译器错误。当你使用
const auto &g = 42g现在是一个const int &,const &可以绑定到一个临时的,并延长它的生命周期。
https://stackoverflow.com/questions/32873834
复制相似问题