gpt4 book ai didi

c++ - 从类型 'int&' 的表达式对类型 'const int' 的引用进行无效初始化

转载 作者:行者123 更新时间:2023-12-01 19:24:17 24 4
gpt4 key购买 nike

当我编写 for(auto &i: s) 时,代码有效,而当我编写 for(int &i: s) 时,代码失败:

[Error] invalid initialization of reference of type 'int&' from expression of type 'const int'.

有人可以解释一下上面的问题吗?

int main(){
int x;
unordered_set<int> s;
for(int i=0; i<6; i++){
cin >> x;
s.insert(x);
}
for(int &i: s)
cout << i << " ";
return 0;
}

最佳答案

unordered_set 具有不可变 键,因此,iteratorconst_iterator 都会为您提供 const 引用(当底层事物不可变时,提供可变引用没有什么意义)。由于类型推导规则,使用 auto 会出现这种情况。

使用int不允许类型推导对其应用const(因为类型推导是针对auto变量完成的) 。因此,您需要显式执行此操作,因为正如您所见,将 const 引用视为非 const 引用是无效的。

无论如何,我都会使用const。通常最好明确您的意图 - 如果您不打算更改变量,请将其设置为const,这样就很明显了。这也可能允许编译器进行某些原本无法进行的优化。

<小时/>

顺便说一句,我刚刚看到 Herb Sutter 的精彩演讲(搜索“量化意外复杂性”)。这是一项使用 inoutinout(基本上是“你想要什么”)等说明符的建议您的函数参数,而不必记住它是否应该是 const、值或引用、是否应该在函数内转发或移动它以及各种其他事情(“如何 你想这么做”)。

这是编码意图的另一个经典示例,在我看来,如果继续下去,将使该语言变得更好。它既不需要知道如何做你想做的事情,又允许编译器进行额外的检查以确保你遵循规则(例如,确保每个代码路径都改变out 变量,或确保在分配给它之前不使用 out 变量)。

如果您对此类内容感兴趣,我建议您看一下。

关于c++ - 从类型 'int&' 的表达式对类型 'const int' 的引用进行无效初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60584544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com