実際のオブジェクトが初期化される前にクラス メソッドが呼び出されるこの奇妙な動作/バグに気付きました。メソッドを持つラッパーオブジェクトがありますoperator->()
。ここで、メソッドを使用してコンストラクターのコンストラクター パラメーターとしてオブジェクトを別のオブジェクトに渡すとoperator->()
、実際のラッパー オブジェクトは構築されず、operator->()
メソッドを実行するだけです。
実際のコード サンプルは非常に複雑で、他の多くの要素に依存しているため、適切にコンパイルされない可能性がある C++ コード スニペットのみを示します。
template<typename T>
class wrapper_object_type
{
public:
wrapper_object_type() {/*does not run*/}
T* operator->() {/*does run*/}
};
class bad_behaviour
{
public:
bad_behaviour() : another_object(wrapper_object->t_object)
{/*crashes(0xccc access violation*/}
};
では、そのような動作を許可する可能性がある標準で定義されているものはありますか? またはより正確には、デフォルトの構築をバイパスできる暗黙の構築などがありますか?