nullptr

127 阅读1分钟

在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;
}