代码之家  ›  专栏  ›  技术社区  ›  skypjack

演绎指南、模板和子对象:哪个编译器是正确的?

  •  11
  • skypjack  · 技术社区  · 6 年前

    请考虑以下片段:

    struct S {
        S() {}
    
        template<typename B>
        struct T {
            T(B &&) {}
        };
    
        template<typename B>
        T(B &&) -> T<B>;
    };
    
    int main() {
        S::T t{0};
    }
    

    铿锵声 accepts it 而GCC rejects the code 出现以下错误:

    prog.cc:10:5:错误:必须在命名空间作用域声明演绎指南的::t(b&)->s::t

    这是有效的密码吗?哪个编译器是正确的,gcc还是clang?

    1 回复  |  直到 6 年前
        1
  •  13
  •   Jarod42    6 年前

    根据 http://en.cppreference.com/w/cpp/language/class_template_argument_deduction

    用户定义的演绎指南必须命名类模板,并且必须在类模板的相同语义范围内引入(可以是命名空间或封闭类),对于成员类模板,必须具有相同的访问权限,但演绎指南不成为该范围的成员。

    所以叮当声似乎是正确的。