1. ホーム
  2. c++

C++:戻り値はL値か?

2023-10-12 15:09:16

質問

このコードを考えてみましょう。

struct foo
{
  int a;
};

foo q() { foo f; f.a =4; return f;}

int main()
{
  foo i;
  i.a = 5;
  q() = i;
}

Clangでさえも文句を言うコンパイラはありません。なぜかというと q() = ... の行は正しいのでしょうか?

どのように解決するのですか?

いいえ、関数の戻り値は、それが参照である場合に限り、l 値です (C++03)。(5.2.2 [expr.call] / 10) 。

返された型が基本型であった場合、これはコンパイルエラーになります。(5.17 [expr.ass] / 1)

これがうまくいく理由は、メンバ関数の呼び出しが許可されているからです(たとえ非 const メンバ関数も)をクラス型のr値に対して呼び出すことができ、 また、その際に foo は実装で定義されたメンバ関数である。 foo& foo::operator=(const foo&) . 第5節の演算子に関する制限は、以下のものだけに適用されます。 組み込み演算子 (5 [expr] / 3), オーバーロードの解決で演算子のオーバーロードされた関数呼び出しが選択された場合、代わりにその関数呼び出しの制限が適用されます。

としてクラス型のオブジェクトを返すことが推奨されることがあるのは、このためです。 const オブジェクトとして返すことが推奨されることがあります (例えば const foo q(); など)、しかしこれは C++0x では悪影響を及ぼす可能性があり、移動のセマンティクスが本来の動作を阻害する可能性があります。