Peacalm Notes

Recent content on Peacalm Notes

马上订阅 Peacalm Notes RSS 更新: https://lishuangquan.cn/index.xml

"nullptr"是指针类型吗?如何用C++的方式把"T*"转换成"void*" | Is "nullptr" a Pointer Type? How to Convert "T*" to "void*" by C++ Way

2023年6月15日 19:58

nullptr是指针类型吗?

nullptr是C++里预定义的一个变量,它的类型是std::nullptr_t。 判断一个类型是否是指针类型,可以用std::is_pointer来判断。 测试std::nullptr_t是否是指针类型的代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <myostream.h>
myostream::ostream mycout(std::cout.rdbuf());
#define watch(...) MYOSTREAM_WATCH(mycout, " = ", "\n", "\n\n", __VA_ARGS__)

int main() {
    // 确认nullptr就是std::nullptr_t类型
    static_assert(std::is_same_v<decltype(nullptr), std::nullptr_t>, "Never happen");

    watch(std::is_pointer_v<std::nullptr_t>,
          std::is_member_pointer_v<std::nullptr_t>,
          std::is_pointer_v<std::nullptr_t *>
    );
    return 0;
}

输出:

1
2
3
std::is_pointer_v<std::nullptr_t> = 0
std::is_member_pointer_v<std::nullptr_t> = 0
std::is_pointer_v<std::nullptr_t *> = 1

可见std::nullptr_t并不是一个指针类型。 只不过我们平时常用nullptr来赋值给任意指针类型,会给人一种std::nullptr_t是指针类型的错觉。

从上例中还可以看出std::nullptr_t *等类型是指针类型,它们是指向std::nullptr_t的指针类型。

原理

std::nullptr_t不是指针类型,但是却可以转换成任意指针类型,并且以0为值。 它的一种实现方式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifdef _LIBCPP_HAS_NO_NULLPTR

_LIBCPP_BEGIN_NAMESPACE_STD

struct _LIBCPP_TEMPLATE_VIS nullptr_t
{
    void* __lx...

剩余内容已隐藏

查看完整文章以阅读更多