在XLC编译器,stddef.h头文件将NULL定义为0,与字面值0相同,导致会调用f(int)这个版本
#include <stdio.h>
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;
}