C++ 11右值引用vs const引用

Emm*_*oli 4 c++ c++11

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

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

std::string x{"test"};
test(std::move(x)); // ok
Run Code Online (Sandbox Code Playgroud)

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

现在看看这个:

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

std::string x{"test"};
other_test(std::move(x)); // ok???
Run Code Online (Sandbox Code Playgroud)

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


我知道

int&& s = 5;
const int& s = 5;
Run Code Online (Sandbox Code Playgroud)

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

Som*_*ken 11

std::move实际上并没有移动它自己的东西.对于演员而言,这只是一个奇特的名字T&&.调用test这样test(std::move(x));只能说明一个T&&隐式转换为一个const T&.编译器看到test它只接受const T&所以它将T&&返回的转换std::move为a const T&,这就是它的全部内容.

  • @EmmaRossignoli因为您无法通过const引用修改对象.使用rvalue引用和移动语义的关键是通过窃取其资源来修改对象. (5认同)
  • 好的谢谢!现在我有另一个问题,当我有 const& 时,为什么我应该将参数声明为 && ? (2认同)
  • @EmmaRossignoli阅读此答案/sf/ask/217427731/#11540204并理解它的全部解释 (2认同)

bol*_*lov 7

简单来说:

  • && 可以绑定到非const rvalues(prvalues和xvalues)
  • const && 可以绑定到rvalues(const和非const)
  • & 可以绑定到非const左值
  • const &可以绑定到rvalues(prvalues和xvalues)和lvalues(每个都是const和非const).阿卡什么的.


Xir*_*ema 5

如果您希望函数明确允许 const-Lvalue 对象,但明确不允许 Rvalue 对象,请像这样编写函数签名:

void test(const std::string&) { }
void test(std::string&&) = delete;//Will now be considered when matching signatures

int main() {
    std::string string = "test";
    test(string);//OK
    //test(std::move(string));//Compile Error!
    //test("Test2");//Compile Error!
}
Run Code Online (Sandbox Code Playgroud)