const转发参考给出错误C2440:“正在初始化”:无法从“ const std :: string”转换为“ const std :: string &&”

时间:2019-10-09 07:45:37

标签: c++ c++17 forward-reference

以下给出了编译器错误:

bash: /home/XXX/.local/bin/pip: /home/XXX/anaconda3/bin/python: bad interpreter: No such file or directory

链接至“ godbolt”:https://godbolt.org/z/l6IQQ7

如果我使用 #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; } ,它将编译-但这不会绑定到值。 const auto&将绑定到任何东西,因此自然也可以工作。 但是,在这种情况下,auto&&不绑定背后的逻辑是什么? 我知道const auto&&将保留常量性-但是有一种方法可以使auto&&明确,同时又与参考/值无关

动机:

对于函数内部的“正常编程工作”,最好能说类似以下内容:“我不在乎它是值还是引用-但我不会在其余部分更改它函数”

使用当前语言,应该可以做到这一点。

相关问题: Why adding `const` makes the universal reference as rvalue

1 个答案:

答案 0 :(得分:5)

  

对于函数内部的“正常编程工作”,这将是很棒的   可以这样说:“我不在乎这是一个价值还是   参考-但我不会在其余功能中更改它。”

您已经有了动机的解决方案:使用const auto&const auto&将绑定到:

  • 常量左值引用
  • 左值引用
  • 常量右值引用
  • 右值参考
  • 此外,它将延长返回值的寿命

因此您拥有了所需的一切。是的,它与const rvalue引用不同,但是,只要使用它就不会有问题,因为因为它是const,所以无论如何都无法从它中移出。

最后注意:auto&&将始终是参考。它是带有推论的转发参考,但是您的最终变量将始终是参考(rvalue ref或lvalue ref,但绝不能是“ value”)。也许那是一个误解?

相关问题