【发布时间】:2014-08-04 07:27:35
【问题描述】:
以下代码
#include <string>
struct Foo {
operator double() {
return 1;
}
int operator[](std::string x) {
return 1;
}
};
int main() {
Foo()["abcd"];
}
使用 g++ 可以正常编译,但使用 clang 和 intel 编译器会失败,因为声明的方法和本机运算符 [] 之间存在歧义。
如果Foo 隐式转换为int,我会很清楚,但这里转换为double。这不是解决歧义吗?
【问题讨论】:
-
如果您将转换运算符删除为
double,会发生什么情况? -
在没有转换运算符的情况下可以在 clang 上正常工作。
-
当你删除
Foo::operator[]时它是否与icc一起编译? -
@n.m.在我的计算机上使用 icl(icc 的 Windows 版本)进行了检查,它确实可以编译。但随后 icl 也错误地编译了 §13.3.1.2 [over.match.oper]/p7 中标准规定不应编译的示例之一,所以...
标签: c++