当研究这个问题的示例代码时,我认为是未定义行为导致后续使用
std::cout
无法打印。但事实证明,尝试打印空指针会导致其流状态中设置std::ios_base::badbit
和std::ios_base::failbit
,这才是它无法操作的真正原因。因此,我现在很好奇打印空指针是否真的是未定义行为。所以这里有我的问题:
打印空指针是否是未定义行为?如果是,那么流插入器的什么特性会导致这种情况?我相当确定插入器足够聪明,不会对空指针进行解引用。
我还想知道,为什么在这种情况下(具体地说是
badbit
),插入器会设置其错误掩码。为什么它不像字符串字面值的终止符一样对待它呢?
我没有可靠的标准,到目前为止,我只找到了一个链接失效的来源。
nullptr
检查。使用clang+libc++构建程序时,程序段错误,但是使用clang+libstdc++则不会。 - Praetorianoperator<<(char *)
之前进行额外的NULL检查会使正确编码的程序变慢。 - M.M