9

別の回答によると、右辺値の参照は、それを参照する式がxvalue式である場合、一時的なものの存続期間を延長しません。右辺値参照を返すのでstd::move、それを呼び出す式はx値であり、次のようにぶら下がっている参照になります。

int main()
{
  std::string&& danger = std::move(get_string());  // dangling reference !
  return 0;
}

それはいいです。ここstd::moveでは意味がありません。すでに右辺値です。

しかし、ここで私は空白を描いています。これは、引数としてxvalue式を渡すこと、完全に標準的な使用法、std::moveおよび右辺値参照とどのように異なりますか?

void foo(const std::string& val);
// More efficient foo for temporaries:
void foo(std::string&& val);

int main()
{
  std::string s;
  foo(std::move(s)); // Give up s for efficiency
  return 0;
}

prvalueまたはxvalueのどちらであるかに関係なく、一時的なものの存続期間を延長する右辺値参照引数の特別なルールはありますか?または、std::move呼び出し元の式は、すでに右辺値であるものを渡したため、xvalueのみですか?とにかくxvalueである右辺値参照を返すので、私はそうは思いません。私はここで混乱しています。私は愚かな何かが欠けていると思います。

4

2 に答える 2

8

2番目の例は、一時的なものへの参照を渡すのではなく、変数への参照を渡すことです。変数sは、の終わりまで続きmain()ます。

だった場合(たとえばfoo(std::move(get_string()));)、一時的な存続期間は、関数が戻った後、完全な式が終了するまで続きます。したがって、内で使用するのは非常に安全ですfoofooその引数への参照/ポインタを格納し、他の何かが後でそれを使用しようとする場合にのみ危険があります。

于 2012-11-27T13:33:38.377 に答える
7

ここで有効期間を延長する必要はありません。問題のオブジェクトは、の終わりまで続きます。mainこれは、の終わりの後ですfoo

于 2012-11-27T13:31:03.417 に答える