C++ nullptr
nullptr
表示指针,它的类型是std::nullptr_t
(nullptr有类型!NULL没有类型),它是prvalue
-
可以看到
nullptr
经编译器生成的汇编代码会直接变为0,所以nullptr
是一个有类型的常量0(注意有极个别的平台可能不为0,"Seriously, have any actual machines really used nonzero null pointers, or different representations for pointers to different types?") -
还可以看到即便
newa
和newint
都初始化为nullptr
,但是他们的地址是不同的
-
由于
nullptr
具有类型,所以可以作为模板和函数的参数template<class T> constexpr T clone(const T& t) { return t; } void f(std::nullptr_t) { std::cout << "null pointer overload\n"; } int main() { clone(nullptr); // Fine // clone(NULL); // ERROR: non-literal zero cannot be a null pointer constant // clone(0); // ERROR: non-literal zero cannot be a null pointer constant f(clone(nullptr)); // Fine }
-
nullptr
可以隐式转换其他的指针void f(int) // f(nullptr) 编译错误 void f(int*) // f(nullptr) 编译成功,隐式转换为int* void f(double*) // 如果同时存在f(int*)和f(double*),则编译报错[函数重载调用不明确] void f(std::nullptr_t) // 如果同时存在f(int*)和f(double*)和f(std::nullptr_t),则优先匹配f(std::nullptr_t)
-
std::nullptr_t
定义的不同变量有不同的地址