右辺値への代入: その理由とその方法
クラス型の戻り値 (右辺値) への代入が可能なのはなぜですか?従来、右辺値は一時的なものと考えられており、メモリ アドレスがありません。では、これらを左側の値 (左辺値) としてどのように使用できるのでしょうか?
次の不可解なコードを考えてみましょう:
class Y { public : explicit Y(size_t num = 0) {} }; int main() { Y(1) = Y(0); // WHAT?!? return 0; }
このコードは、非論理的に見えるかもしれませんが、エラーなしでコンパイルされます。その理由を理解するには、代入演算子の背後にある仕組みを詳しく調べる必要があります。
合成された代入演算子
クラスが代入演算子を明示的に定義していない場合、コンパイラは自動的に1つを生成します。合成された演算子は、次の 2 つの形式のいずれかを取ることができます。
後者の形式は右辺値に適用されるため注目に値します。したがって、上記の例では、コンパイラはコンストラクター Y(1) によって返される右辺値を受け入れる代入演算子を生成します。
右辺値への代入の防止
If右辺値への代入を禁止したい場合は、ref 修飾子を使用して代入演算子を明示的に宣言できます。このようにして、演算子が左辺値のみを受け入れるように制限できます。例:
class Y { public : explicit Y(std::size_t num = 0); Y& operator=(Y const&) & = default; };
ref 修飾子 & を使用すると、合成された代入演算子が左辺値に対してのみ使用可能になります。
以上が右辺値への代入: 禁止されていますか? それとも機能ですか?なぜ戻り値に代入できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。