-> 之后带有类型别名的推导指南
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 模板”参数推导,但不支持它们的(单独的)推导指南。
看看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 模板”参数推导,但不支持它们的(单独的)推导指南。