来自移动的返回右值参考不会保留

时间:2013-08-10 13:00:43

标签: c++ c++11

我有这段代码:

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

我尝试输出:

cout << getString() << endl;

它给我空输出。

当我使用时:

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

有效。

我的问题:

  1. 为什么第一个不工作?我移动了引用,因此不应该销毁本地对象?

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

1 个答案:

答案 0 :(得分:1)

  

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

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以来),否则应该复制。另见this

你只需要写:

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