nullptr
和 nullptr_t
是 C++11 引入的两个概念,它们之间有一些重要的区别。
nullptr
nullptr
是一个关键字,用来表示空指针常量。在 C++11 之前,NULL
被用来表示空指针,但由于 NULL
通常被定义为整数 0
,可能会引发一些类型相关的问题。例如:
void f(int);
void f(char*);
f(NULL); // 调用 f(int),而不是 f(char*),可能会产生歧义
为了解决这个问题,C++11 引入了 nullptr
。nullptr
是一种特殊的常量,表示空指针,其类型是 std::nullptr_t
。使用 nullptr
可以避免上述类型歧义的问题:
void f(int);
void f(char*);
f(nullptr); // 明确调用 f(char*)
nullptr_t
nullptr_t
是表示 nullptr
的类型的类型名。它是一个特殊的类型,可以用来声明和定义接受或返回 nullptr
的变量或函数。例如:
std::nullptr_t nptr; // 声明一个 nullptr_t 类型的变量
nptr = nullptr; // 赋值 nullptr 给这个变量
std::nullptr_t getNull() {
return nullptr;
}
区别总结
nullptr
是一个表示空指针的关键字,其类型是std::nullptr_t
。std::nullptr_t
是nullptr
的类型。#include <iostream> #include <type_traits> void f(int) { std::cout << "f(int)" << std::endl; } void f(char*) { std::cout << "f(char*)" << std::endl; } int main() { std::nullptr_t nptr = nullptr; // nullptr_t 类型的变量 f(nullptr); // 调用 f(char*) f(nptr); // 也是调用 f(char*) // 输出类型信息 std::cout << "Type of nullptr: " << typeid(nullptr).name() << std::endl; std::cout << "Type of nullptr_t: " << typeid(std::nullptr_t).name() << std::endl; return 0; }
运行上述代码将输出:
f(char*) f(char*) Type of nullptr: nullptr_t Type of nullptr_t: nullptr_t
从输出中可以看出,
nullptr
的类型是std::nullptr_t
。