打印空指针未定义行为?

0x4*_*2D2 5 c++ iostream null-pointer undefined-behavior

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

  1. 打印空指针是未定义的行为吗?如果是这样,那么流插入器会导致什么呢?我非常确定插入器足够智能,不会取消引用空指针.

  2. 我还想知道为什么插入器在此上下文中遇到空指针时设置其错误掩码(具体而言badbit).为什么它不像字符串文字的终止那样对待它?

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

Mic*_*urr 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*)功能简单的打印指针的值,所以一个空指针将与超载正常工作.

  • 如果你引用标准来通过`[ostream.inserters.character]`而不是做`27.7.3.6.4`那么它有更多的机会仍然是可能重新编号的章节或部分的不同版本中的有效引用. (5认同)