右辺値への代入: 禁止されていますか? それとも機能ですか?なぜ戻り値に代入できるのでしょうか?

Patricia Arquette
リリース: 2024-10-31 09:19:30
オリジナル
400 人が閲覧しました

 Assignment to Rvalues: Forbidden or Feature? Why Can We Assign to a Return Value?

右辺値への代入: その理由とその方法

クラス型の戻り値 (右辺値) への代入が可能なのはなぜですか?従来、右辺値は一時的なものと考えられており、メモリ アドレスがありません。では、これらを左側の値 (左辺値) としてどのように使用できるのでしょうか?

次の不可解なコードを考えてみましょう:

class Y {
public :
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}
ログイン後にコピー

このコードは、非論理的に見えるかもしれませんが、エラーなしでコンパイルされます。その理由を理解するには、代入演算子の背後にある仕組みを詳しく調べる必要があります。

合成された代入演算子

クラスが代入演算子を明示的に定義していない場合、コンパイラは自動的に1つを生成します。合成された演算子は、次の 2 つの形式のいずれかを取ることができます。

  • Y& 演算子=(Y const&)
  • Y& 演算子=(Y&)()

後者の形式は右辺値に適用されるため注目に値します。したがって、上記の例では、コンパイラはコンストラクター Y(1) によって返される右辺値を受け入れる代入演算子を生成します。

右辺値への代入の防止

If右辺値への代入を禁止したい場合は、ref 修飾子を使用して代入演算子を明示的に宣言できます。このようにして、演算子が左辺値のみを受け入れるように制限できます。例:

class Y {
public :
    explicit Y(std::size_t num = 0);
    Y& operator=(Y const&) & = default;
};
ログイン後にコピー

ref 修飾子 & を使用すると、合成された代入演算子が左辺値に対してのみ使用可能になります。

以上が右辺値への代入: 禁止されていますか? それとも機能ですか?なぜ戻り値に代入できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!