从移动返回的右值引用未持久化

Return rvalue reference from move is not persisted

本文关键字:引用 持久化 移动 返回      更新时间:2023-10-16

我有这个代码:

string&& getString() {
    string s {"test"};
    return move(s);
}

我试着输出:

cout << getString() << endl;

它给了我空的输出。

当我使用:

string getString() {
    string s {"test"};
    return move(s);
}

它有效。

我的问题:

  1. 为什么第一个不起作用?我移动了引用,所以本地对象不应该被销毁?

  2. 第二个是否"复制"(不考虑RVO)?

为什么第一个不起作用?我移动了引用,所以本地对象不应该被销毁?

string&& getString() {
    string s {"test"};  // s is a local variable
    return move(s);     // move doesn't really move object, it turns the object to rvalue
}

您正在返回对本地non-static对象的右值引用
右值引用是一个引用,在引用本地对象时返回它意味着返回对不再存在的对象的引用。是否使用std::move()并不重要,因为std::move并没有真正移动对象,它会将对象变成右值

第二个是否"复制"(不考虑RVO)?

编译器应该首先考虑RVO,然后考虑move(由于C++11),否则应该复制。也可以看到这个。

你只需要写:

string getString() {
  string s {"test"};
  return s;
}