Невозможно напечатать значение 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;
}