我正在阅读关于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
的值?
答案 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_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;
}