C++ 打印空指针是否为未定义行为?

C++ 打印空指针是否为未定义行为?,c++,iostream,undefined-behavior,null-pointer,C++,Iostream,Undefined Behavior,Null Pointer,在研究示例代码时,我假设它是未定义的行为,这会阻止后续使用std::cout进行打印。但事实证明,这才是它无法运行的真正原因。因此,我现在很好奇(试图)打印空指针是否真的是未定义的行为。下面是我的问题: 打印空指针是未定义的行为吗?如果是这样,流插入器的哪些方面会导致这种情况?我非常确定插入器足够聪明,不会去引用空指针 我还想知道为什么插入器在这个上下文中遇到空指针时会设置错误掩码(特别是badbit)。为什么它不将其视为字符串文字的终止 我手头没有标准的,到目前为止我只找到了一个不幸导致死链接

在研究示例代码时,我假设它是未定义的行为,这会阻止后续使用
std::cout
进行打印。但事实证明,这才是它无法运行的真正原因。因此,我现在很好奇(试图)打印空指针是否真的是未定义的行为。下面是我的问题:


  • 打印空指针是未定义的行为吗?如果是这样,流插入器的哪些方面会导致这种情况?我非常确定插入器足够聪明,不会去引用空指针

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


  • 我手头没有标准的,到目前为止我只找到了一个不幸导致死链接的源代码。

    basic\u ostream
    操作符gcc
    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);
    
    模板
    基本组&
    
    运算符libstdc++可能正在执行额外的
    nullptr
    检查,但不需要这样做。当您使用clang+libc++构建程序时,它将被激活。但不是用CLAN+LIbSTDC + +“我很确定插入器足够聪明,不去引用空指针。”-通常,C++标准说明编译器必须做什么,以及其他什么,它们不必做。在每次调用
    operator@MattMcNabbLOL,我认为当使用与C++ I/O流慢得惊人的速度时,空校验的速度是一个问题。密切相关:(几乎是一个DUPE,TBH),如果你引用了标准,通过代码> [oSoCur.Enter Studio.Cyter ]。
    如果不执行
    27.7.3.6.4
    ,则它更有可能在可能重新编号章节的不同版本中仍然是有效参考。