请考虑以下代码:
struct S {
using T = int;
operator T() { return 42; }
};
int main() {
S s;
S::T t = s;
// Is the following line correct?
t = s.operator T();
}
它与GCC(4.9 / 5.1 / 6.1)编译,但无法用clang(3.8 / 3.7)编译。
返回的错误是:
错误:未知类型名称'T';你是说'S :: T'吗?
在这种情况下哪种编译器正确?为什么?
注意
解决问题需要T
:
t = s.operator S::T();
问题不在于如何使其发挥作用。
答案 0 :(得分:15)
我相信这是clang bug(以#27807提交)
如果 id-expression 是 conversion-function-id ,则首先在班级中查找其 conversion-type-id 的 使用对象表达式和名称(如果找到)。否则,它会在整个上下文中查找 后缀表达式。在每个查找中,只有表示其特化的类型或模板的名称 是类型被考虑。 [例如:
struct A { }; namespace N { struct A { void g() { } template <class T> operator T(); }; } int main() { N::A a; a.operator A(); // calls N::A::operator N::A }
-end example]
在t = s.operator T();
中,首先在T
的类中查找S
,该类应找到您的typedef,因此最终会调用operator int()
。