正如您所指出的,规格:
explicit basic_iostream(basic_streambuf<charT,traits>* sb);
初始化两个基。我从来没有接受过:
http://cplusplus.github.com/LWG/lwg-closed.html#135
因为它会导致单个 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>*) 一次来执行basic_ios/的实际构造ios_base。
这是一个非常混乱的设计。通过拒绝双重初始化虚拟基础,我觉得 libc++ 使设计不那么混乱,并且更可靠。这是移动构造函数的标准行为,而不是采用streambuf*.