我试图理解为什么C++标准/编译器会歧视auto的行为。我举的例子如下:
int main()
{
const int i = 34;//top level const on rhs. i is const int
const auto &p = i;// low level const on rhs. p is const int&
auto &g = i;//g is const int& . In this case the compiler is able to deduce that only reference to const can be bound to a const int
//auto &k = 5;//but in this case the compiler is not able(allowed) to deduce that only a reference to const can be bound to a prvalue
return 0;
}如上面的代码示例所示,编译器能够/允许推导出变量g的类型,因为只有对const类型的引用可以绑定到const类型,而在下一种情况下,即使只有对const类型的引用可以绑定到const类型,编译器也不能推导出变量k的类型。当然,rvalue引用也可以绑定到prvalue或xvalue。
我的问题是,即使我们有对一些auto推导类型的左值引用,为什么C++标准不允许编译器将k推导为const int&,就像在变量g的情况下一样?对我来说,这似乎足够直观了。也许有一些与此相关的问题,你们中的任何一个都可以告诉我。
我知道初始化器的顶级常量被忽略了。例如,
const int i = 5;
auto k = i; //k is deduced to be int because the top level const of the initializer i is ignored我的问题是关于rhs中低级const的隐含加法/扣除法。
发布于 2021-09-30 09:15:27
原因是
auto &k = 5;是不可编译的,这与下列不可编译的原因相同
template<typename T>
void f(T&) {}
int main() {
f(5);
}那么,如果问题是为什么不能将auto推导为const int__?在第一个片段中,这个问题转换为为什么不能将T演绎为const int__?在第二个代码片段中。
好的,规则»说,你传递给f的表达式的类型,在本例中是int,因为5是int (这里没有const ),是根据参数的类型T&来确定T的。因此,唯一的可能性是T为int,因此参数的类型为int&。
但是不能向int&参数传递诸如5之类的右值,这与类型推导无关。实际上,Clang在上面给出的f(5)错误是
T = int的
候选函数不可行:第一个参数需要左值
所以没有像“我可以添加一个const来使它有效吗?”这样的聪明的事情。还在继续。
将上面的内容与这里推导出const的原因进行比较:
const int i = 34;
auto &g = i;同样,您可以使用上面定义的f将第二个语句映射到f(i)。在本例中,表达式(i)的类型为const int (而不是int作为5),因此当T&与其进行模式匹配时,T将被推导为const int。
²我指的是Scott Meyer的Effective现代C++中的项目1。
https://stackoverflow.com/questions/69388477
复制相似问题