"nullptr"是指针类型的吗?如何用C++的方式把"T*"转换成"void*" | Is "nullptr" a Pointer Type? How to Convert "T*" to "void*" by C++ Way
💡
原文中文,约4800字,阅读约需12分钟。
📝
内容提要
nullptr是C++里预定义的一个变量,它的类型是std::nullptr_t。虽然std::nullptr_t不是指针类型,但可以转换成任意指针类型,并以0为值。std::nullptr_t有两种实现方式,一种是类类型,一种是编译器内置的非类类型。判断std::nullptr_t是否是类类型可以使用std::is_class。默认情况下,std::nullptr_t不是类类型,而是独特的类型,可以使用std::is_null_pointer来判断。nullptr是右值临时变量,无法取地址,但可以使用std::nullptr_t重新定义一个左值来取地址。将"T*"转换成"void*"可以使用C语言的强制类型转换或使用C++的类型转换方式。cv-qualified std::nullptr_t类型的变量可以直接赋值给std::nullptr_t类型的变量,但cv-qualified std::nullptr_t*类型的变量需要使用const_cast转换后才能赋值。
🎯
关键要点
- nullptr是C++里预定义的变量,类型为std::nullptr_t。
- std::nullptr_t不是指针类型,但可以转换成任意指针类型,值为0。
- std::nullptr_t有两种实现方式:类类型和编译器内置的非类类型。
- 可以使用std::is_class判断std::nullptr_t是否是类类型,默认情况下不是。
- nullptr是右值临时变量,无法取地址,但可以定义std::nullptr_t的左值来取地址。
- 可以使用C语言的强制类型转换将'T*'转换为'void*'。
- 使用C++的方式转换'T*'为'void*'需要先用const_cast去掉cv属性,再使用reinterpret_cast或static_cast。
- cv-qualified std::nullptr_t类型的变量可以直接赋值给std::nullptr_t类型的变量。
- cv-qualified std::nullptr_t*类型的变量需要使用const_cast转换后才能赋值。
🏷️
标签
➡️