下面给出一个编译器错误:
#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;
}
链接到神螺栓:https://godbolt.org/z/l6IQQ7
如果我使用const auto&
它会编译 - 但这不会绑定到值。auto&&
将被绑定到任何东西上,这样自然也会起作用。 但是,在这种情况下const auto&&
不具有约束力背后的逻辑是什么? 我知道auto&&
会保持恒定性 - 但是有没有办法const
明确,同时与参考/值无关?
赋予动机:
对于函数等内部的"正常编程工作",能够这样说:">我不在乎它是一个值还是引用 - 但我不会为函数的其余部分更改它">,那就太好了。
鉴于当前的语言,这应该是可能的。
相关问题:为什么添加"const"会使通用引用成为右值
对于函数等内部的"正常编程工作",那就太好了 能够这样说:"我不在乎它是否是一个值或 参考 - 但我不会为其余功能更改它"。
您已经有了动力的解决方案:使用const auto&
.const auto&
将绑定到:
- 常量左值参考
- 左值参考
- 常量右值参考
- 右值引用
- 此外,它将延长返回值的生存期
所以你得到了你需要的一切。是的,它与 const 右值引用不同,但如果您只是使用它,那也没关系,因为无论如何您都无法从它移动,因为它是常量。
最后注意:auto&&
将始终是一个参考。 它是一个带有扣除的转发引用,但你的最终变量将永远是一个引用(右值引用或左值引用,但绝不是"值"(。也许这是一种误解?