私は誤って次のように動作することを発見して驚いています:私は、自身のコンストラクタに構築されたオブジェクトのアドレスを渡していますC++オブジェクトを独自のコンストラクタに合法的に渡していますか?
#include <iostream>
int main(int argc, char** argv)
{
struct Foo {
Foo(Foo& bar) {
std::cout << &bar << std::endl;
}
};
Foo foo(foo); // I can't believe this works...
std::cout << &foo << std::endl; // but it does...
}
。これは、ソースレベルで循環定義のように見えます。標準では、実際にオブジェクトが構築される前に関数にオブジェクトを渡すことができますか、この未定義の動作ですか?
すべてのクラスメンバ関数が、暗黙的なパラメータとしてクラスインスタンスのデータへのポインタを既に持っていることを考えると、それほど奇妙ではないと思います。また、データメンバのレイアウトはコンパイル時に固定されています。
私はこれが有用か良い考えであるかどうか質問しません。私は、クラスについてもっと学ぶためにちょうど周りをちょっと調べています。
@ShafikYaghmourなぜ回答を削除しましたか?制限のために[basic.life] p6の引用を追加するだけです。 – dyp
はい、それは問題ありません。基本的にコンストラクタで 'this'を使うのと同じですが、全ての落とし穴があります。 –
これは 'size_t x = sizeof(x)'のようなものではありませんか?オブジェクトのコンストラクタは、メモリが割り当てられている場所(不特定のソースから)で呼び出されます。ストレージのプロパティにのみ依存し、値の解釈に依存しない限り、物事は安全でなければなりません。 – MSalters