在XLC编译器,stddef.h头文件将NULL定义为0,与字面值0相同,导致会调用f(int)这个版本 ```
include
void f(char* c) { printf("invoke f(char* c)\n"); }
void f(int i) { printf("invoke f(int i)\n"); }
int main() { f(0); f(NULL); // 如果用gcc编译,NULL转化为内部标识__null,该语句编译失败 f((char*)0); return 0; } ```
typedef decltype(nullptr) nullptr_t;
int main() { f(nullptr); f(0); return 0; }
int main() { // nullptr可以隐式转换为char* char* cp = nullptr; // 不可转换为整型,而任何类型也不能转换为nullptr_t // 以下代码不能通过编译 int n1 = nullptr; int n2 = reinterpret_cast<int>nullptr; // nullptr与nullptr_t类型变量可以作比较, // 当使用== <= >=符号比较时返回true nullptr_t nptr; if (nptr == nullptr) { cout << "nptr == nullptr" << endl; } else { cout << "nptr != nullptr" << endl; } if (nptr < nullptr) { cout << "nptr < nullptr" << endl; } else { cout << "nptr !< nullptr" << endl; } // 不能转换为整型或bool类型,以下代码不能通过编译 // if (0 == nullptr) // if (nullptr) // 不可以进行算术运算,以下代码不能通过编译 // nullptr += 1; // nullptr * 5; // 以下操作均可以正常进行 sizeof(nullptr); typeid(nullptr); throw(nullptr); return 0; }