似乎在纯粹布尔上下文中的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更高的优先级.