6

在研究这个问题的示例代码时,我假设它是未定义的行为,它阻止了后续使用的std::cout打印。但事实证明,尝试打印空指针会导致std::ios_base::badbit并将std::ios_base::failbit其设置为流状态,这是导致其无法运行的真正原因。因此,我现在很好奇(尝试)打印空指针是否真的是未定义的行为。所以这是我的问题:

  1. 打印空指针是未定义的行为吗?如果是这样,导致这种情况的流插入器是什么?我很确定插入器足够聪明,不会取消引用空指针。

  2. 我还想知道为什么插入器在此上下文中遇到空指针时设置其错误掩码(特别是badbit)。为什么不将其视为字符串文字的终止?

我手边没有标准,到目前为止,我只发现了一个不幸导致死链接的来源。

4

2 回答 2

11

basic_ostreamoperator<<(basic_ostream<>&, const char*)函数要求char*非空 - 它旨在打印指针指向的字符串。因此,将 null 发送char*cout. (参见 C++11 27.7.3.6.4/3“字符插入函数模板”)。

但是,basic_ostreamoperator<<(basic_ostream<>&, const void*)函数只是打印指针的值,因此空指针将在该重载下正常工作。

于 2014-04-25T04:05:01.603 回答
2

海湾合作委员会ostream.tcc第 319 行:

template<typename _CharT, typename _Traits>
  basic_ostream<_CharT, _Traits>&
  operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s)
  {
    if (!__s)
__out.setstate(ios_base::badbit);

gcc 只是执行标准不保证的检查,这很好,因为它无论如何都是未定义的。

于 2014-04-25T04:53:36.863 回答