gpt4 book ai didi

c++ - 移动 basic_iostream 时 basic_ostream 基会发生什么变化?

转载 作者:太空狗 更新时间:2023-10-29 19:53:44 25 4
gpt4 key购买 nike

就在我认为我了解 C++11 中 iostream 的多遍移动构造时(感谢 https://stackoverflow.com/a/8156356/273767 的介绍),我遇到了这个:

§27.7.2.5.1[iostream.cons]/3

basic_iostream(basic_iostream&& rhs);

3 Effects: Move constructs from the rvalue rhs by constructing the basic_istream base class with move(rhs).

那么另一个基地 basic_ostream 会怎样?

我看到 libc++ 给 std::basic_ostream 一个 protected default constructor ,它在这里被调用(并且与 §27.7.2.5.1/1 的字母相矛盾,在正常的 constructor of basic_iostream 中),并且什么也不做。就应该这样吗?

最佳答案

正如您所指出的,规范:

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>*) exactly once 进行 basic_ios 的实际构造/ios_base .

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

关于c++ - 移动 basic_iostream 时 basic_ostream 基会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11313437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com