运营商演员,GCC和clang:哪个编译器是对的?

时间:2016-05-18 22:05:34

标签: c++ c++11 gcc clang language-lawyer

请考虑以下代码:

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();

问题不在于如何使其发挥作用。

1 个答案:

答案 0 :(得分:15)

我相信这是clang bug(以#27807提交)

来自[basic.lookup.classref]

  

如果 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()