这无法使用 g++ 4.6.1 在指定位置编译:
enum Ea { Ea0 };
enum Eb { Eb0 };
struct Sa { void operator()(Ea) {} };
struct Sb { void operator()(Eb) {} };
struct Sbroken : Sa, Sb {};
struct Sworks {
void operator()(Ea) {}
void operator()(Eb) {}
};
int main() {
Sworks()(Ea0);
Sbroken()(Ea0); // g++ can't disambiguate Ea vs. Eb
}
Clang 2.8 确实编译了这段代码,这让我不确定代码是否真的是有效的 C++。我正要乐观地得出结论,clang 是对的,g++ 是错的,但后来我做了一个小改动,让 clang 出现了类似的错误:
enum Ea { Ea0 };
enum Eb { Eb0 };
struct Sa { void f(Ea) {} };
struct Sb { void f(Eb) {} };
struct Sbroken : Sa, Sb {};
struct Sworks {
void f(Ea) {}
void f(Eb) {}
};
int main() {
Sworks().f(Ea0);
Sbroken().f(Ea0); // both clang and g++ say this is ambiguous
}
我在那里所做的唯一更改是使用命名函数f而不是operator(). 我不明白为什么这很重要,但它确实如此:这个版本不能用 g++ 或 clang 编译。