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中基本相同)
你是什么意思"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.