2

次の関数を検討してください。C++17の回答が欲しいです。

MyClass&& func() {
  return MyClass{};
}

int main() {
  MyClass&& myRef = func();
}

質問:

  1. func()は xvalue ですか? なんで?
  2. myRefダングリング リファレンスとはなぜですか? または、より具体的にはfunc()、ダングリング参照を返すのはなぜですか? 右辺値参照を返すと、一時的な具体化が発生し、一時オブジェクトの有効期間が延長されませんか?
4

1 に答える 1

3

func()言語のルールの 1 つは、関数がオブジェクトへの右辺値参照の戻り値の型を持つように宣言されている場合、その関数の呼び出しで構成される式は xvalue であるためです。(C++17 expr.call/11)。

一時的な実体化は、参照が prvalue にバインドされるたびに発生します。

関数の結果myRefは、 prvalue によって初期化されますfunc()。ただし、class.temporary/6 の有効期間延長ルールを参照すると、次のようになります。

関数 return ステートメントで返された値にバインドされた一時的な有効期間は延長されません。一時的なものは、return ステートメントの完全な式の最後で破棄されます。

したがって、実体化された一時オブジェクトは、ステートメントが完了すると、拡張なしでfunc() 破棄されます。return

于 2020-06-10T05:18:51.610 に答える