-> 之后带有类型别名的推导指南

Deduction guide with type alias after ->

看看this code:

template<class T>
struct S {
    template<class U>
    S(U) {}
};

template<typename T>
using SP = S<T*>;

// template<class U>
// S(U) -> S<U*>;

template<class U>
S(U) -> SP<U>;

S s(0);

很遗憾,被Clang拒绝了:

error: deduced type 'SP<U>' (aka 'S<type-parameter-0-0 *>') of deduction 
       guide is not written as a specialization of template 'S'
S(U) -> SP<U>;
        ^~~~~~~~~~

ICC 以类似错误拒绝它:

error: the return type must directly designate a specialization 
       of the associated class template

但是,GCC 和 MSVC 都编译此代码。

哪个编译器是正确的?毕竟,类型别名只是一个别名。

这里 Clang 和 ICC 是正确的:关于如何命名模板和类型的限制是 phrased syntactically。 C++20 允许对别名模板进行“class 模板”参数推导,但不支持它们的(单独的)推导指南。