以下给出了编译器错误:
#include <string>
const std::string& get_name();
int main(){
auto&& name1 = get_name();//should bind to whatever
const auto& name2 = get_name();//also ok
const auto&& name3 = get_name();//<-not ok, why ?
return 0;
}
链接到Godbolt:https://godbolt.org/z/l6IQQ7
如果我使用
const auto&
,它将编译-但这不会绑定(bind)到值。auto&&
将被绑定(bind)到任何东西,因此自然也可以工作。但是,在这种情况下
const auto&&
不绑定(bind)背后的逻辑是什么?我知道
auto&&
将保留常量性-但是有没有办法明确显示const
并同时与引用/值无关?动机:
对于函数内部的“正常编程工作”,最好能说这样的话:“我不在乎它是值还是引用-但我不会在其余函数中更改它”。
给定当前语言,这应该是可能的。
相关问题: Why adding `const` makes the universal reference as rvalue
最佳答案
您已经为您的动机准备了解决方案:使用const auto&
。 const auto&
将绑定(bind)到:
这样您便拥有了所需的一切。是的,它与const rvalue引用不同,但是如果您仅使用它就没有关系,因为因为它是const,所以无论如何您都无法从它中移出。
最后说明:
auto&&
将始终是引用。它是一个带有推论的转发引用,但是您的最终变量将始终是引用(rvalue ref或lvalue ref,但绝不能是“value”)。也许那是/是一个误解?关于c++ - const转发引用给出错误C2440 : 'initializing' : cannot convert from 'const std::string' to 'const std::string &&' ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58299331/