代码之家  ›  专栏  ›  技术社区  ›  mojuba

为什么C++中的布尔和指针的奇怪兼容性?

  •  1
  • mojuba  · 技术社区  · 15 年前

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

    但是这个兼容性规则也允许为错误的类型选择重载的函数/运算符。假设你超载了 operator << 对于所有基本类型,如果忘记重载void指针,编译器可能会选择 bool ,或者相反。

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

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

    1 回复  |  直到 15 年前
        1
  •  7
  •   Ben Voigt    15 年前

    你说的“C能正确处理这个问题”是什么意思?C不允许函数重载,因此您一定会得到您所抱怨的bool<->指针转换。

    你问为什么这个转换存在吗?

    第一个实际上不是转换bool->指针,而是识别 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类型。

    推荐文章