C 11右值参考与const参考

这可能是显而易见的,但我认为这对我来说很难.鉴于这种:

void test(std::string&&) { }

std::string x{"test"};
test(std::move(x)); // ok

此代码使用rvalue引用作为参数调用test(),以便程序按照我的预期进行编译.

现在看看这个:

void other_test(const std::string&) { }

std::string x{"test"};
other_test(std::move(x)); // ok???

在这里,我倾斜了.为什么这个版本会编译? std :: move返回一个&&类型;为什么然后我在第二种方法中没有出现错误,我使用const&?

我知道

int&& s = 5;
const int& s = 5;

是有效的,因为在这两种情况下我提供的东西都没有左值,它没有地址.和&&和const&当量?如果不是,有区别吗?

最佳答案
std :: move实际上并没有移动任何东西.对于T&&的演员而言,这只是一个奇特的名字.像这个测试一样调用测试(std :: move(x));只显示T&&可隐式转换为const T&amp ;.编译器看到测试只接受const T&所以它转换了T&&从std :: move返回到const T&,这就是它的全部内容.

转载注明原文:C 11右值参考与const参考 - 代码日志