为什么运算符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
呢?毕竟,您可以显式地进行所有转换。