【问题标题】:Why can std::cout print the value of nullptr only if returned by a function?为什么 std::cout 只有在函数返回时才能打印 nullptr 的值?
【发布时间】:2016-07-16 10:15:05
【问题描述】:

根据这个问题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 被函数返回 时它实际上可以。

【问题讨论】:

标签: c++ cout nullptr


【解决方案1】:

原因是nullptr 可以转换为任何指针类型(“可打印”),但它本身不是指针。

看看What exactly is nullptr?

【讨论】:

    【解决方案2】:

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

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

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

    在您的情况下,它在某种程度上几乎是一个 (TYPE) 指针,因此当您尝试粘贴它时,它会粘贴它的类型值(它指向的位置,但它本身不会)。你的函数返回一个 int*,你给它一个 nullptr。所以你基本上在做的是给一个 int* 一个值。 nullptr 本身没有值,但是

    int* abc = nullptr;
    

    会的。

    【讨论】:

    • “在某种程度上它几乎是一个 int 指针”。绝对不。而且它不是指针。
    • 是的,答案被编辑为“在你的情况下”,所以现在我不需要添加“Int 指针”的情况(根据问题,而不是对象本身)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2012-06-14
    相关资源
    最近更新 更多