这不仅有效,而且即使使用-Wall也不会发出任何警告:
void* p = false; // actually 'true' doesn't work here
bool b = "Hello, Boolean!";
但此兼容性规则也允许为错误的类型选择重载的函数/运算符。假设您为所有基本类型重载了operator <<
,并且忘记重载void指针,那么编译器可能会选择采用bool
的版本,反之亦然。
那么是什么让这种兼容性规则比重载函数的奇怪(和非常不受欢迎的)副作用更重要?
(编辑:删除了对C的所有引用,它们错了:转换规则在C中基本相同。)
答案 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。