クラス型の右辺値への代入が可能なのはなぜですか?
C では、一般に右辺値式への代入は実行できません。ただし、この動作は次のコード スニペットで違反しているようです。
class Y { public : explicit Y(std::size_t num = 0) {} }; int main() { Y(1) = Y(0); // Assignment to rvalue return 0; }
説明:
最初の期待に反して、このコードは正常にコンパイルされます。その理由は、メンバー関数、特に代入演算子の暗黙的な合成にあります。 C 標準 (セクション 12.8 [class.copy]、段落 18) によれば、代入演算子が宣言されていない、または削除済みとしてマークされていない場合、コンパイラーは代入演算子を合成します。クラス型 Y の場合、合成された代入演算子は次のシグネチャを持ちます:
これらの署名にはパラメータの前に参照修飾子 (&) が含まれていないことに注意してください。したがって、合成された代入演算子は右辺値式に適用できます。
この動作により、コンストラクター Y(1) を呼び出して作成された一時オブジェクトへの代入が可能になります。
左側の防止-Hand Side Temporary:
割り当ての左側に一時オブジェクトが作成されないようにするために、「コピー省略」と呼ばれる手法を使用できます。これには、次の変更されたコードに示すように、ref 修飾子を使用した代入演算子の宣言が含まれます:
class Y { public : explicit Y(std::size_t num = 0); Y& operator= (Y const&) & = default; };
この変更により、合成された代入演算子は右辺値に適用できなくなります。
以上がC でクラス型の右辺値に代入できるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。