【问题标题】:Operator cast, GCC and clang: which compiler is right?运算符转换、GCC 和 clang:哪个编译器是正确的?
【发布时间】:2016-09-15 14:30:24
【问题描述】:

考虑以下代码:

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

问题不在于如何让它发挥作用。

【问题讨论】:

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


    【解决方案1】:

    我认为这是 clang 错误(以 #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
    }
    

    ——结束示例]

    t = s.operator T(); 中,首先在S 的类中查找T,它应该会找到您的typedef,因此最终会调用operator int()

    【讨论】:

    • @Barry 谢谢,我昨天要为 clang 打开一个错误,但我无法找到/理解参考的正确部分。仍然要学习 如何 正确阅读它... :-(
    • @T.C.那么,您是说这实际上是一个语言的错误? :-)
    • @skypjack :是。这两个 DR 的解决方案都被合并到了 C++11 中。
    • @ildjarn 对,。错误的术语。谢谢。
    猜你喜欢
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2022-10-12
    • 2019-08-06
    相关资源
    最近更新 更多