コンストラクターが終了する前に、このポインターをクラスの外で安全に使用できますか(コンストラクターからの仮想関数呼び出しを意味するわけではありません)?
私はこのようなものを意味します:
#include <iostream>
class Bar;
class Foo
{
public:
Foo(Bar* bar);
};
class Bar
{
public:
Bar() : instance(this) {}
void foo()
{
std::cout << "Bar::foo() \n";
}
private:
Foo instance;
};
Foo::Foo(Bar* bar)
{
bar->foo(); // UB or not
}
int main()
{
Bar instance;
}
このコードをMSVC-11.0でコンパイルしようとすると、次の警告が表示されます。
警告C4355:'this':ベースメンバー初期化子リストで使用されます
そして、そのようなコードはどうですか?
#include <iostream>
class Foo;
void bar(Foo* instance);
class Foo
{
public:
Foo()
{
bar(this);
}
void foo()
{
std::cout << "Foo::foo() \n";
}
};
void bar(Foo* instance)
{
instance->foo(); // UB or not
}
int main()
{
Foo instance;
}
標準からの見積もりが見つかりません。