考虑以下:
std::ostream out(nullptr);
这是合法且明确定义的吗?
如果我现在这样做怎么样:
out << "hello world\n";
这是合法且明确定义的吗?如果是这样,大概这是一种无操作?
是的,实例化该流是合法且定义明确的。您可以安全地与另一个流交换它,或者稍后给它一个新的指针(这次指向现有的缓冲区)。输出操作本身确实是一个无操作。
原因如下:
-
该构造没有非空前提条件,只有以下后置条件:
[C++11: 27.7.3.2/2]:
后置条件:rdbuf() == sb
.
-
有趣的是,它明确指出不得对sb
在构造函数内:
[C++11: 27.7.3.2/4]:
备注:不执行任何操作rdbuf()
.
-
但还要注意:
[C++11: 27.7.3.2/1]:
作用:构造一个类的对象basic_ostream
,通过调用为基类分配初始值basic_ios<charT,traits>::init(sb)
(27.5.5.2)。
-
That init(sb)
调用有设置的效果badbit
在流上时sb
一片空白:
[C++11: 27.5.5.2/3]:
后置条件:该函数的后置条件如表 128 所示。
[C++11: Table 128]:
[..] rdstate()
: goodbit
if sb
不是空指针,否则badbit
. [..]
-
输出操作would导致相当于取消引用空指针的操作:
[C++11: 27.7.3.1/2]:
两组成员函数签名具有共同的属性:格式化输出函数(或插入器)和未格式化输出函数。两组输出函数通过相当于调用的动作生成(或插入)输出字符rdbuf()->sputc(int_type)
.他们可以使用其他公共成员basic_ostream
但他们不得调用任何虚拟成员rdbuf()
except overflow()
, xsputn()
, and sync()
.
但它永远不会走到这一步,因为对于basic_ostream::sentry
建造:
[C++11: 27.7.3.4/3]:
如果在完成任何准备工作后,os.good()
is true
, ok_ == true
否则,ok_ == false
.
并且,对于explicit operator basic_ostream::sentry::bool() const;
:
[C++11: 27.7.3.4/5]:
效果:回报ok_
.
and:
[C++11: 27.7.3.7/1]:
每个未格式化的输出函数通过构造类的对象开始执行sentry
。如果这个对象返回true
,同时转换为类型值bool
,该函数尽力生成所请求的输出。[..]
…这意味着当badbit
已设置。
C++03 中也是如此。 https://stackoverflow.com/a/6240980/560648
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)