考虑以下用于包装枚举的类
class A {
int v;
A(int v) : v(v) { }
public:
enum B : int { X = 1, Y = 2, Z = 3 };
A(B v) : A(static_cast<int>(v)) { }
A operator|(const A &b) const { return v | b.v; }
operator bool() const { return v; }
};
int main() {
A a(A::Y);
if (a)
return 1;
a = a | A::X; // this line failes to compile
return 0;
}
我在标记的线路上出现了关于ambigous overload的错误
1.cpp:15:11: note: candidates are:
1.cpp:15:11: note: operator|(int, int) <built-in>
1.cpp:7:7: note: A A::operator|(const A&) const
如果我注释掉bool强制转换操作符,那么ambigous过载错误会消失,所以我建议从跟随投射路径引起歧义
(A)a -[operator]-> (bool)a -[implicit?]-> (int)a
有没有办法解决这种歧义? bool运算符用于允许
if (a) ...
我宁愿坚持使用
之类的东西if (!!a) ...
with operator!()。