为什么 std::cout 只能在函数返回时打印 nullptr 的值?

Why can std::cout print the value of nullptr only if returned by a function?

根据这个问题Unable to print the value of nullptr on screen

我无法打印 nullptr 的值,因为它是 nullptr_t 类型,并且 std::cout 没有这样的重载。

但是,如果你看这个:

int* f()
{
    return nullptr;
}

int main()
{
    std::cout << f();
}

输出为:

00000000

在这个问题中 Why does std::cout output disappear completely after NULL is sent to it 他们讨论了不同的问题。

我只是想了解为什么 std::cout 不能打印 nullptr,但实际上当 nullptr 被返回时它可以 返回 通过一个函数。

原因是 nullptr 可以 转换 到任何指针类型(即 "printable"),但它本身不是指针。

看看What exactly is nullptr?

这是 CPP 标准 [4.10] 中 nullptr 的含义

  • 空指针常量是整型常量表达式 (5.19) 纯右值,其计算结果为零或 std::nullptr_t 类型的纯右值。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与对象指针或函数指针类型的所有其他值区分开来。这样的转换称为空指针转换。

CPP 标准规定,它不是 std::nullptr_t 值,它的计算结果为 零或 std::nullptr_t 类型的纯右值。

在你的情况下,它在某种程度上几乎是一个 (TYPE) 指针,所以当你尝试将它粘贴出来时,它会粘贴出它的类型值(它指向的地方,但它本身不会).你的函数 returns 一个 int*,你给它一个 nullptr。所以你基本上做的是给一个 int* 一个值。 nullptr 本身没有值,但是

int* abc = nullptr;

会。