ホームページ >バックエンド開発 >C++ >C オブジェクトを独自のコンストラクターに渡すことはできますか?

C オブジェクトを独自のコンストラクターに渡すことはできますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-13 15:00:04236ブラウズ

Can You Pass a C   Object into Its Own Constructor?

C オブジェクトを独自のコンストラクターに渡す

C では、直観に反しているように思えるかもしれませんが、実際に C オブジェクトをそのコンストラクターに渡すことは合法です。独自のコンストラクター。次のコード スニペットを考えてみましょう:

#include <iostream>

struct Foo {
    Foo(Foo& bar) {
        std::cout << &bar << std::endl;
    }
};

int main(int argc, char** argv) {
    Foo foo(foo); // Surprising, yet valid
    std::cout << &foo << std::endl;
}

この例では、構築された Foo オブジェクト (&foo) のアドレスを独自のコンストラクターに渡しています。これは循環定義に似ているかもしれませんが、C 標準では未定義の動作とはみなされません。

説明

標準では、初期化されていないオブジェクトを限定された方法で使用することができます。完全な初期化。具体的には、参照をバインドしたり、そのアドレスを取得したりすることが許可されます。これは、欠陥レポート 363 およびドラフト C 14 標準のセクション 3.8 で定義されています。

これは、上記のコードでは、言語によって設定された制約に違反していないことを意味します。標準に準拠した方法で、コンストラクター内で初期化されていない foo オブジェクトを使用しているだけです。

Clang の警告

ただし、一部のコンパイラでは、 Clang のように、初期化されていない変数について警告を発行する場合があります。これは、初期化されていない自動変数から不定の値を生成することは、一般に未定義の動作とみなされるためです。ただし、この場合、参照をバインドしてコンストラクター内でアドレスを取得するだけであるため、不確定性は導入されません。

制限

強調することが重要です。この動作は標準で許可されていますが、良い実践であるとみなされるべきではなく、実際の使用例があるべきではありません。この議論の主な目的は、C 言語のセマンティクスのあまり知られていない側面に光を当てることです。

以上がC オブジェクトを独自のコンストラクターに渡すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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