ご指摘のとおり、次の仕様は次のとおりです。
explicit basic_iostream(basic_streambuf<charT,traits>* sb);
両方のベースを初期化します。私はそれで大丈夫だったことがありません:
http://cplusplus.github.com/LWG/lwg-closed.html#135
同じ仮想ベースオブジェクトで単一の関数が2回呼び出されるためです。 basic_ios::init()
委員会は、この二重初期化は無害であると判断しました。私は、この詳細に関して仕様を実装することを拒否するほど強く反対しました。しかし、仕様では、仮想基本クラスを二重に初期化するように指示されています。
移動コンストラクターを指定するときbasic_iostream
、私は運転席にいました。そして、私はそれを私が最もよく考えた方法で指定しました(二重に初期化しないようにbasic_ios
)。その決定はまだ異議を唱えられていませんが、おそらく最終的には異議を唱えられるでしょう。
二重初期化を回避するために、basic_ostream
デフォルトのコンストラクターは、まったく何もしないように注意深く作成する必要があることに注意してください。そして、何も意味がありません。ゼロ初期化なし:
protected:
_LIBCPP_ALWAYS_INLINE
basic_ostream() {} // extension, intentially does not initialize
幸い、の基本クラスはbasic_ostream
、デフォルトのコンストラクターでは何もしないように実際に指定されています。つまり、すべてが正常に機能 します。basic_ostream
デフォルトの構成であり、メモリには影響しません。次に、派生クライアントは/の実際の構築を行うためinit(basic_streambuf<char_type, traits_type>*)
に1回だけ呼び出します。basic_ios
ios_base
それは本当に厄介なデザインです。仮想ベースを二重に初期化することを拒否することで、libc ++によって設計が少し面倒でなくなり、信頼性が少し向上したと思います。これは、moveコンストラクターの標準的な動作であり、。を取るコンストラクターの標準的な動作ではありませんstreambuf*
。