无法在屏幕上打印nullptr的值

时间:2014-02-14 06:55:11

标签: c++ c++11

我正在阅读关于nullptr和g ++以及VS2010的锻炼。

当我做的时候

#include <iostream>
using namespace std;

auto main(void)->int
{
    int j{};    
    int* q{};   

    cout << "Value of j: " << j << endl; // prints 0
    cout << nullptr << endl;
    cout << "Value of q: " << q << endl; // prints 0

    return 0;
}

在屏幕上打印nullptr的值,g ++和VS给出了编译错误。 是否不允许在屏幕上打印nullptr的值?

3 个答案:

答案 0 :(得分:8)

指针文字是关键字nullptr。它是std :: nullptr_t类型的prvalue。

类型nullptr_t应该可以转换为T*,但编译器对operator <<没有nullptr_t,并且不知道要转换为nullptr的类型。

您可以使用此

cout << static_cast<void*>(nullptr) << endl;

答案 1 :(得分:4)

这是因为nullptr的类型为std::nullptr_t,它没有为std::cout定义适当的运算符来打印该类型的对象。您可以自己定义操作符:

//std::cout is of type std::ostream, and nullptr is of type std::nullptr_t
std::ostream& operator << (std::ostream& os, std::nullptr_t ptr)
{
    return os << "nullptr"; //whatever you want nullptr to show up as in the console
}

定义此功能后,它将用于处理通过nullptr打印ostream的所有尝试。这样,每次打印时都不需要投射nullptr

答案 2 :(得分:1)

我在编写一些类型参数化的测试代码(使用模板)时遇到了这个问题。我需要打印T类型的值,其中nullptr_tT的有效类型。我想出了一个解决方案,其中要打印的值包含在printable模板函数中。然后,当使用nullptr_t时,此函数使用模板特化来提供所需的行为。

#include <cstddef>
#include <iostream>

template <typename T> struct Printable
{
    Printable(const T& val) : val(val) {}
    void print(std::ostream& out) const {out << val;}
    const T& val;
};

template <> struct Printable<std::nullptr_t>
{
    Printable(nullptr_t) {}
    void print(std::ostream& out) const {out << "null";}
};

template <typename T>
Printable<T> printable(const T& value) {return Printable<T>(value);}

template <typename T>
std::ostream& operator<<(std::ostream& out, const Printable<T>& p)
{
    p.print(out);
    return out;
}

int main() {
    std::cout << printable(42) << " " << printable(nullptr) << "\n";
    return 0;
}

Ideone link