为什么operator char *()在布尔上下文中覆盖运算符bool()const?

时间:2014-04-29 05:49:13

标签: c++ operator-overloading

似乎在纯粹布尔上下文中的c ++中,operator char*()的优先级高于operator bool() const;并启用c ++ 11模式并使用explicit operator bool() const没有帮助。这是g ++中的错误还是语言标准中的错误?或者,我没有看到这种疯狂行为的充分理由吗?

该问题的简单演示:

#include <stdio.h>

struct A
{
    char buf[512];
    int err;

    operator char* () { return buf; }
    operator const char* () const { return buf; }
    operator bool () const { return !err; }
    // explicit operator bool () const { return !err; } // same problem
};

int main()
{
    A a;
    a.err = -42;
    if (a) {
        printf("lolwut?\n");
        return 1;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

正如@oakad所解释的那样 - 优雅的解决方案是在c ++ 11模式下使用explicit operator char*()。这将确保operator char*()不会在布尔上下文中使用。

作为explained by @bolov - 观察到的行为是语言标准的一部分。根据13.3.1,为了解析重载函数,方法被认为具有隐式对象参数。对于没有ref-qualifier声明的方法,此参数是对具有相应cv-qualifier的类的引用。

所以我们有效地遇到以下情况:

char* op(A& a) { return a.buf; }
bool op(const A& a) { return !a.err; }

由于a中的const不是main(),因此非const运算符被选中。无论我们是operator char*()还是operator int()还是operator double()都无关紧要 - 可以在布尔上下文中使用的非const强制转换操作符的优先级高于operator bool() const