0

我有这个代码:

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

我试图输出:

cout << getString() << endl;

它给了我空的输出。

当我使用:

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

有用。

我的问题:

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

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

4

1 回答 1

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 起),否则它应该复制。也看到这个

你只需要写:

string getString() {
  string s {"test"};
  return s;
}
于 2013-08-10T13:08:15.890 回答