C でオブジェクトを独自のコンストラクターに渡す
一部の C プログラマーは、オブジェクトを独自のコンストラクターに渡すという興味深い動作を発見しました。これにより、そのような行為が合法なのか、それとも C で未定義の動作とみなされるのかという疑問が生じます。
次のコード スニペットを考えてみましょう。
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main() { Foo foo(foo); // Surprisingly, this compiles and executes std::cout << &foo << std::endl; }
このコードでは、Foo コンストラクターは、オブジェクトが完全に初期化される前に、オブジェクト自体が構築されます。オブジェクトは初期化されていませんが、コードは C 標準で許可されています。
C 14 ドラフト標準のセクション 3.8 では、オブジェクトの有効期間が始まる前 (または終了した後) にそのアドレスを取得することが許可されることを明確にしています。または、参照が直接バインドできる限り、参照をバインドします。未定義の動作は、左辺値から右辺値への変換、非静的データ メンバーへのアクセス、仮想基本クラス バインディングなどの特定の操作が、部分的に初期化されたオブジェクトに対して実行される場合にのみ発生します。
提供されているコード例では、これらの制限のいずれかに違反すること。参照をバインドし、コンストラクター内でアドレスを取得しているだけであり、これは許可されています。ただし、
アクティブな問題 453 では、初期化されていないオブジェクトへの参照のバインドの有効性について懸念が生じています。最初に提案された言語は、コード スニペットで示されているようなバインディングを許可する欠陥レポート 363 をサポートしています。
この動作は最初は奇妙に見えるかもしれませんが、初期化前にコンパイラがオブジェクトにスペースを割り当てた結果です。これにより、不定の値を生成することなく、参照バインディングやアドレス取得などの限定された操作が可能になります。
以上がC でオブジェクトを独自のコンストラクターに渡すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。