C++ nullptr/nullptr_t


解释
关键词 nullptr 代表指针字面量。它是 std::nullptr_t 类型的纯右值。存在从 nullptr 到任何指针类型及任何成员指针类型的隐式转换。同样的转换对于任何空指针常量也存在,空指针常量包括 std::nullptr_t 的值,以及宏 NULL。

引入原因

为什么引入nullptr呢, 不是有NULL这个关键字么?

的确,但是我想问你NULL是什么类型的?

C++98中NULL是个宏定义,明确规定NULL是个整型0值:

1 /* Define NULL pointer value */ 2 #ifndef NULL 3 #ifdef __cplusplus 4 #define NULL 0 5 #else /* __cplusplus */ 6 #define NULL ((void *)0) 7 #endif /* __cplusplus */ 8 #endif /* NULL */

C中NULL规定为void*指针:

#define NULL ((void*)0)

可以看出,C和C++中NULL的规定是不同的,原因在于C++的重载机制。

1 void foo(int) 2 void foo(int*) 3 4 foo(0); // 调用foo(int)而不是foo(int*) 5 foo(NULL); // 如果NULL是0,则调用foo(int); 如果NULL是0L,则编译错误

C++98规定NULL是一个整型0值,根据不同的编译器实现,可能是0或0L。更尴尬的是,可以拿NULL当合法的整型(int或者long)来使用,所以C++11引入了nullptr表示指针的0值,虽然它不是指针类型,但是它能够转换成任何指针,而且它不能转换成int或者其他类型:

1 oid foo(char *); 2 void foo(int); 3 #include <iostream> 4 #include <typeinfo> 5 int main() 6 9 foo(0); // 调用 foo(int) 10 // foo(NULL); // 该行不能通过编译 11 foo(nullptr); // 调用 foo(char*)

std::nullptr_t

nullptr也有其自身的类型,它的类型为std::nullptr_t。std::nullptr_t本身不是指针类型,但是它可以转换为任何指针类型,这也就是nullptr可以看做任何指针类型的原因。它的定义如下:

typedef decltype(nullptr) nullptr_t;

上面是一个很有趣的类型定义。通常情况是先有类型,然后才有该类型的变量。而上面的定义则是,先有一个某类型的字面值,再由这个字面值定义它的类型。妙哉!



上一篇:SetWindowPos函数详解

下一篇:Qt QWidget::find注意事项


C/C&#x2B;&#x2B;
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图