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

时间:2010-11-06 00:24:17

标签: c++ pointers overloading

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

void* p = false;  // actually 'true' doesn't work here
bool b = "Hello, Boolean!";

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

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

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

1 个答案:

答案 0 :(得分:7)

“C可以正确处理”是什么意思? C不允许函数重载,因此保证你有bool&lt; - &gt;你抱怨的指针转换。

您是否在询问为何存在此转化?

第一个实际上并不是转换bool - &gt;指针,但是正在识别文字false表示0,这是一个有效的指针值。这就是为什么它不适用于true,而且它不适用于bool变量。

第二个是因为能够写下来很高兴:

if (p)

而不是

if (p != 0)

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

编辑:影响T* p = false;

的标准规则
  

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

  

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

  

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