const 转发引用给出错误 C2440:'initializing':无法从 'const std::string' 转换为 'const std::string &&'
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;
}
Link 神马:https://godbolt.org/z/l6IQQ7
如果我使用 const auto&
它会编译 - 但不会绑定到值。
auto&&
将绑定到任何东西,这样自然也能正常工作。
但是,在这种情况下 const auto&&
不具有约束力的背后逻辑是什么?
我知道 auto&&
会保留常量性——但有没有办法让 const
明确,同时 reference/value 不可知 ?
动机:
对于 'normal programming work' 内部函数等,如果能够这样说就好了:"I do not care if it's a value or reference - but I do not change it for the rest of the function".
鉴于当前的语言,这应该是可能的。
相关问题:
For 'normal programming work' inside functions etc. it would be great
to be able to say something like: "I do not care if it's a value or
reference - but I do not change it for the rest of the function".
您已经有了满足您动机的解决方案:使用 const auto&
。 const auto&
将绑定到:
- const 左值引用
- 左值引用
- const 右值引用
- 右值引用
- 此外,它将延长返回值的生命周期
所以你得到了你需要的一切。是的,它不同于 const rvalue ref,但如果你只是使用它就没有关系,因为你无论如何都无法从它移动,因为它是 const.
最后说明:auto&&
将始终作为参考。它是一个带有推导的转发引用,但你的最终变量将始终是一个引用(右值引用或左值引用,但绝不是 "value")。也许 was/is 是一种误解?
下面给出编译错误:
#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;
}
Link 神马:https://godbolt.org/z/l6IQQ7
如果我使用 const auto&
它会编译 - 但不会绑定到值。
auto&&
将绑定到任何东西,这样自然也能正常工作。
但是,在这种情况下 const auto&&
不具有约束力的背后逻辑是什么?
我知道 auto&&
会保留常量性——但有没有办法让 const
明确,同时 reference/value 不可知 ?
动机:
对于 'normal programming work' 内部函数等,如果能够这样说就好了:"I do not care if it's a value or reference - but I do not change it for the rest of the function".
鉴于当前的语言,这应该是可能的。
相关问题:
For 'normal programming work' inside functions etc. it would be great to be able to say something like: "I do not care if it's a value or reference - but I do not change it for the rest of the function".
您已经有了满足您动机的解决方案:使用 const auto&
。 const auto&
将绑定到:
- const 左值引用
- 左值引用
- const 右值引用
- 右值引用
- 此外,它将延长返回值的生命周期
所以你得到了你需要的一切。是的,它不同于 const rvalue ref,但如果你只是使用它就没有关系,因为你无论如何都无法从它移动,因为它是 const.
最后说明:auto&&
将始终作为参考。它是一个带有推导的转发引用,但你的最终变量将始终是一个引用(右值引用或左值引用,但绝不是 "value")。也许 was/is 是一种误解?