移动basic_iostream时basic_ostream基数会发生什么变化?

Cub*_*bbi 3 c++ iostream c++11

就在我以为我理解了C++ 11中iostreams的多遍移动构造时(感谢/sf/answers/570944951/的介绍),我遇到了这个问题:

§27.7.2.5.1[iostream.cons]/3

basic_iostream(basic_iostream&& rhs);

3效果:通过构造basic_istream基类来从rvalue rhs移动构造move(rhs).

那么另一个基地会发生什么basic_ostream

我看到libc ++提供了std::basic_ostream一个受保护的默认构造函数,在此处调用(并且,与basic_iostream的常规构造函数中的§27.7.2.5.1/ 1的字母相矛盾),并且什么都不做.这是怎么回事?

How*_*ant 7

正如你所指出的,规范为:

explicit basic_iostream(basic_streambuf<charT,traits>* sb);
Run Code Online (Sandbox Code Playgroud)

初始化两个基数.我从来没有对此表示满意:

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
Run Code Online (Sandbox Code Playgroud)

幸运的是,基类basic_ostream实际上被指定为在其默认构造函数中不执行任何操作.所以一切正常: basic_ostream默认构造并且不触及内存.然后派生客户端只调用init(basic_streambuf<char_type, traits_type>*) 一次来执行basic_ios/ 的实际构造ios_base.

这是一个非常混乱的设计.通过拒绝对虚拟基础进行双重初始化,我觉得libc ++使设计变得不那么混乱,而且更加可靠.这是移动构造函数的标准行为,而不是构造函数的标准行为streambuf*.