首先让我给你一个简单的实现 nullptr_t
struct nullptr_t
{
void operator&() const = delete; // Can't take address of nullptr
template<class T>
inline operator T*() const { return 0; }
template<class C, class T>
inline operator T C::*() const { return 0; }
};
nullptr_t nullptr;
nullptr
是Return Type Resolver惯用法的一个细微示例,它根据分配给它的实例的类型自动推断出正确类型的空指针。
int *ptr = nullptr; // OK
void (C::*method_ptr)() = nullptr; // OK
- 如上所述,
nullptr
将其分配给整数指针时,将int
创建模板化转换函数的类型实例化。方法指针也是如此。
- 通过这种方式,利用模板功能,实际上每次创建新类型分配时,我们都会创建适当类型的空指针。
- 正如
nullptr
值为零的整数文字,您无法使用通过删除&运算符完成的地址。
我们为什么nullptr
首先需要?
1️⃣隐式转换
char *str = NULL; // Implicit conversion from void * to char *
int i = NULL; // OK, but `i` is not pointer type
2️⃣函数调用的歧义
void func(int) {}
void func(int*){}
void func(bool){}
func(NULL); // Which one to call?
error: call to 'func' is ambiguous
func(NULL);
^~~~
note: candidate function void func(bool){}
^
note: candidate function void func(int*){}
^
note: candidate function void func(int){}
^
1 error generated.
compiler exit status 1
3️⃣构造函数重载
struct String
{
String(uint32_t) { /* size of string */ }
String(const char*) { /* string */ }
};
String s1( NULL );
String s2( 5 );
- 在这种情况下,您需要显式强制转换(即
String s((char*)0))
。
nullptr
还用于表示C ++ / CLI中托管句柄的空引用。