似乎一个包参数只能在别名模板的包参数的位置展开。这不适用于类或函数模板:
template <class T, class... Args> struct x { using type = T; };
template <class T, class... Args> using x_t = typename x<T, Args...>::type;
template <class... Args> using x_fix_t = typename x<Args...>::type;
template <class... Args> auto f(Args...) -> void {
typename x<Args...>::type v1; // OK
x_t<Args...> v2; // Error
x_fix_t<Args...> v3; // OK
}
更简单的情况:
template <class T, class U> using y_t = T;
template <class... Args> auto f(Args...) -> void {
y_t<Args...> v4; // Error
}
上面的代码使用and in和生成错误(即使f
从未实例化)。c++11
c++14
g++ 4.9
g++ 5.1
clang 3.5
为什么不允许这样做?一般规则是什么?我认为没有理由限制这一点。这似乎是一个非常奇怪的禁令。
至于为什么不像x_fix_t
第一个变体那样写,更清楚的是x_t
有一个强制性的第一个参数。(例如,这是f()
不允许的原因)。但这并不重要,修复很容易。问题仍然存在:为什么?
gcc 错误:
error: pack expansion argument for non-pack parameter ‘T’ of
alias template ‘template<class T, class ... Args> using x_t = typename x::type’
叮当错误:
error: pack expansion used as argument for non-pack parameter of
alias template x_t<Args...> v2;