似乎在纯粹布尔上下文中的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;
}
答案 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
。