0

私はこのコードを持っています:

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

そして私は出力しようとしました:

cout << getString() << endl;

空の出力が得られます。

私が使用する場合:

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

できます。

私の質問:

  1. 最初のものはなぜ機能しないのですか?ローカル オブジェクトが破棄されないように参照を移動しましたか?

  2. 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はありません。実際にはオブジェクトを移動しないため、オブジェクトを右辺値に変換します

2番目のものは「コピー」しますか(RVOを考慮していません)?

コンパイラは、最初に RVO を考慮してmoveから (C++11 以降)、それ以外の場合はコピーする必要があります。これも見てください。

あなたはただ書く必要があります:

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