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 サイトの他の関連記事を参照してください。