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

似乎在纯粹布尔上下文中的c中,运算符char *()的优先级高于operator bool()const;并启用c 11模式并使用显式运算符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;
}

最佳答案 正如@oakad所解释的那样 – 优雅的解决方案是在c 11模式下使用显式运算符char *().这将确保运算符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在main()中是非const的,因此非const运算符被选中.我们是否有运算符char *()或运算符int()或运算符double()无关紧要 – 可以在布尔上下文中使用的非const转换运算符将具有比运算符bool()const更高的优先级.

点赞