ホームページ  >  記事  >  バックエンド開発  >  クラス型の右辺値参照に代入できますか? パラドックスの説明。

クラス型の右辺値参照に代入できますか? パラドックスの説明。

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 17:44:02359ブラウズ

 Can You Assign to Rvalue References of Class Type?  A Paradox Explained.

クラス型の右辺値参照への代入: 解決されたパラドックス

C の領域では、左辺値と右辺値の区別が最も重要です。左辺値は変更可能なメモリ位置を持つオブジェクトを表しますが、右辺値は変更できない一時オブジェクトまたは定数を具体化します。しかし、興味深いコード スニペットによって、この基本的な相違点について疑問が生じます。

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

int main() {
    Y(1) = Y(0); // Here lies the enigma!
    return 0;
}</code>

なぜこのコードはコンパイルされるのでしょうか?コンストラクターによって返される右辺値は一時的であり、代入には適していませんか?

このパラドックスを理解する鍵は、 C の暗黙的な代入演算子にあります。代入演算子がクラスに対して明示的に定義されていない場合、コンパイラはデフォルトの代入演算子を合成します。重要なのは、この合成された演算子は場合によっては右辺値に適用できることです。

ここで明示的なキーワードが役割を果たします。この例では、Y クラスは代入演算子を宣言していないため、コンパイラが代入演算子を生成します。 Explicit キーワードは右辺値からの暗黙的な変換を防ぎますが、合成された代入演算子が右辺値に適用されることを妨げません。

したがって、コードでは、合成された代入演算子は次のようになります。

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

または

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

は、左側の右辺値 Y(1) を使用して呼び出すことができます。これにより、Y(1) が右辺値であっても代入を続行できます。

一時オブジェクトへの代入を防ぐために、参照修飾子 (&) を使用して代入演算子を明示的に宣言できます:

<code class="cpp">class Y {
public:
    explicit Y(std::size_t num = 0);
    Y& operator=(Y const&) & = default;
};</code>

この場合、代入演算子は合成されず、右辺値に代入しようとするとコンパイル エラーが発生します。

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

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