常量转发引用给出错误 C2440:"正在初始化":无法从"常量标准::字符串"转换为"常量标准::字符串 &&"
const forwarding reference gives error C2440: 'initializing': cannot convert from 'const std::string' to 'const std::string &&'
下面给出一个编译器错误:
#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&&
将始终是一个参考。 它是一个带有扣除的转发引用,但你的最终变量将永远是一个引用(右值引用或左值引用,但绝不是"值"(。也许这是一种误解?
相关文章:
- 将常量字符串添加到非常量字符串是否会给出常量字符串
- 将收到的 usart uint8_t* 数据与常量字符串进行比较
- 为什么文字不是常量(字符串除外)?
- public:静态常量字符串声明/初始化问题
- 如何打印出常量字符串的第一个元素?
- 为什么在类体中无法启动静态常量字符串成员
- 如何从常量字符串初始化 LPWSTR?
- 如何在 C++03 中没有重复代码的情况下在堆栈上创建一个非常量 C 字符串数组?
- 需要帮助理解' 字符串 ltrim(常量字符串 &) ' 的含义
- 从常量字符串到布尔值的隐式强制转换
- 比较字符和常量字符串
- C++ lambda 到 std::函数错误与非常量字符串
- 让每个常量字符串都被引用是好的做法吗?
- 外部常量字符串的链接错误
- 无法初始化静态常量字符串
- 如何更改静态链接库中常量字符串数组的Visual Studio C++初始化顺序
- 对已编译的可执行文件中的常量字符串(例如密码)进行加密
- C++ 构造函数中的常量字符串 &name 和字符串名称之间的差异
- 哪个是正确的:矢量<常量字符串>或常量矢量<string>?
- 为什么字符串在函数参数中作为常量字符串传递