将强制转换为bool可以将强制转换为int

时间:2015-05-09 10:18:51

标签: c++11 enums

考虑以下用于包装枚举的类

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!()。

0 个答案:

没有答案