ホームページ >バックエンド開発 >C++ >C でクラス型の右辺値に代入できますか?

C でクラス型の右辺値に代入できますか?

DDD
DDDオリジナル
2024-10-28 09:26:29747ブラウズ

 Can You Assign to an Rvalue of Class Type in C  ?

クラス型右辺値への代入

概要

C プログラミング言語では、通常、右辺値 (右辺値) を左辺値として使用できません (左側の値)。ただし、次のコードに示すように、この規則には例外があります。

<code class="cpp">class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}</code>

驚くべきことに、コンストラクター Y(1) によって返されるオブジェクトが右辺値であっても、このコードは正常にコンパイルされます。この記事では、この予期しない動作の背後にある理由を検討します。

クラス型右辺値への代入

このコードが有効である理由を理解する鍵は、合成されたメンバー関数の概念にあります。代入演算子を明示的に定義していないクラスの場合、コンパイラはデフォルトの代入演算子を生成します。このデフォルトの演算子は、同じクラスのオブジェクトへの参照をパラメータとして受け取るメンバー関数です。

上の例では、クラス Y の代入演算子は次のように合成されます。

<code class="cpp">Y& Y::operator=(const Y& other);</code>

注目すべきは、この合成された代入演算子は非 const メンバー関数であるということです。これは、左辺値 (参照されるオブジェクト) と右辺値 (参照されないオブジェクト) の両方に適用できることを意味します。

コンストラクターの戻り値

右辺値を返すコンストラクターを使用してオブジェクトが作成される場合、コンパイラはメモリ内に一時オブジェクトを生成します。この一時オブジェクトは、作成されたステートメントの終了時に自動的に破棄されます。ただし、コンストラクターがクラス型の右辺値を返す場合、合成された代入演算子は一時オブジェクトの有効期間を延長できます。

代入構文

代入ステートメント Y(1) = Y(0);は、次のコードの糖衣構文です。

<code class="cpp">Y(1).operator=(Y(0));</code>

すでに確認したように、クラス Y の合成代入演算子 Operator= は非 const メンバー関数であり、右辺値に適用できることを意味します。したがって、コンパイラは、代入ステートメントを、コンストラクター Y(1) によって作成された一時オブジェクトへの代入として解釈できます。

結論

通常の予想に反して、代入することが可能です。明示的に定義された代入演算子を持たずにコンパイラがクラスの非 const 代入演算子を合成するため、C のクラス型の右辺値に変換されます。これらの合成された代入演算子は、コンストラクターによって作成された一時オブジェクトの有効期間を延長し、右辺値への代入を可能にします。

以上がC でクラス型の右辺値に代入できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。