为什么在C++中这种bool和指针的奇怪兼容性?

moj*_*uba 1 c++ pointers overloading

这不仅有效,而且即使使用-Wall也不会发出任何警告:

void* p = false;  // actually 'true' doesn't work here
bool b = "Hello, Boolean!";
Run Code Online (Sandbox Code Playgroud)

此外,此兼容性规则允许为错误的类型选择重载的函数/运算符.假设你operator <<为所有基本类型重载了你并且忘了重载void指针,那么编译器可能会选择所采用的版本,反之亦然bool.

那么是什么让这种兼容性规则比重载函数的奇怪(和非常不受欢迎的)副作用更重要?

(编辑:删除了对C的所有引用,它们错了:转换规则在C中基本相同)

Ben*_*igt 7

你是什​​么意思"C可以正确处理这个"?C不允许函数重载,所以你保证你有抱怨的bool < - >指针转换.

你问为什么这种转换存在?

第一个实际上并不是转换bool - >指针,而是认识到文字false意味着0,这是一个有效的指针值.这就是为什么它无法使用true,并且它不适用于bool变量.

第二个是因为能写的很好:

if (p)
Run Code Online (Sandbox Code Playgroud)

代替

if (p != 0)
Run Code Online (Sandbox Code Playgroud)

检查指针是否包含空指针值.

编辑:标准影响的规则T* p = false;:

空指针常量是整数类型的整数常量表达式prvalue,其计算结果为零

类型bool,char,char16_t,char32_t,wchar_t以及有符号和无符号整数类型统称为整数类型.整数类型的同义词是整数类型.

布尔文字是关键字false和true.这样的文字是prvalues并且有类型bool.

  • @Mojuba,有一个指向bool的转换,并且有一个bool-to-int转换.但是编译器不会同时进行两次隐式转换,因此您不会获得指向指针的转换.使第一个转换显式,你没关系:`int x =(bool)ptr;` (2认同)
  • @mojuba:考虑到C++应该能够编译C代码,这就是*为什么以这种方式完成的原因.如果没有这样做,那么非常大的C程序类就不能编译为C++. (2认同)