Невозможно напечатать значение nullptr на экране

Я читал о 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 ответа

Решение

Указатель-литерал - это ключевое слово nullptr. Это значение типа std::nullptr_t.

Тип nullptr_t должен быть преобразован в T*, но компилятор не имеет operator << за nullptr_t и не знаю, к какому типу вы хотите конвертировать nullptr,

Вы можете использовать это

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

Это потому что 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 каждый раз, когда вы печатаете это.

Я столкнулся с этой проблемой, когда писал некоторый параметризованный тестовый код (используя шаблоны). Мне нужно было напечатать значение типа T, где nullptr_t был допустимым типом для T, Я придумал решение, в котором значение для печати было обернуто внутри 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;
}

Идеальная ссылка

Другие вопросы по тегам