为什么运算符char*()在布尔上下文中重写运算符bool()const? 在纯布尔上下文C++中,运算符CHAR*()/COD>具有比运算符布尔()CONST >更高的优先级;启用c++11模式并使用显式运算符bool()const也无济于事。这是g++中的错误还是语言标准中的错误?还是说我没有看到这种疯狂行为的原因

为什么运算符char*()在布尔上下文中重写运算符bool()const? 在纯布尔上下文C++中,运算符CHAR*()/COD>具有比运算符布尔()CONST >更高的优先级;启用c++11模式并使用显式运算符bool()const也无济于事。这是g++中的错误还是语言标准中的错误?还是说我没有看到这种疯狂行为的原因,c++,operator-overloading,C++,Operator Overloading,这一问题的简单演示: #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 () cons

这一问题的简单演示:

#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;
}
#包括
结构A
{
char-buf[512];
INTERR;
运算符char*(){return buf;}
运算符const char*()const{return buf;}
运算符bool()常量{return!err;}
//显式运算符bool()const{return!err;}//同样的问题
};
int main()
{
A A;
a、 误差=-42;
如果(a){
printf(“lolwut?\n”);
返回1;
}
返回0;
}

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

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

因此,我们实际上存在以下情况:

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

由于
a
main()
中是非
const
,因此将拾取非
const
运算符。不管我们使用的是
运算符char*()
还是
运算符int()
还是
运算符double()
——可以在布尔上下文中使用的非
常量
强制转换运算符的优先级高于
运算符bool()常量
,这可能是由于
常量
。您是否尝试添加
运算符bool(){return!err}
?是的,添加一个非常量版本的
运算符bool()
是一个解决方案,但它感觉像是丑陋和不必要的代码重复(特别是在我的真实代码中,检查并不像
!err
:)有一些方法可以避免
const
和非
const
方法之间的代码重复。找到重复的
显式运算符char
呢?毕竟,您可以显式地进行所有转换。