常量转发引用给出错误 C2440:"正在初始化":无法从"常量标准::字符串"转换为"常量标准::字符串 &&"



下面给出一个编译器错误:

#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&&将始终是一个参考。 它是一个带有扣除的转发引用,但你的最终变量将永远是一个引用(右值引用或左值引用,但绝不是"值"(。也许这是一种误解?

最新更新