gcc 不接受默认模板参数中的包扩展
gcc doesn't accept pack expansion in default template argument
以下代码使用 clang 编译成功,但 gcc 失败:
struct fn
{
template <typename ... Args>
static constexpr bool call (Args ... ) { return true; }
};
template <typename ... T>
static constexpr bool f = false;
template <typename ... Ts, bool F = fn::call(f<Ts> ...)>
void hoge () {}
int main () {}
gcc 5.1.0 (-Wall -Wextra -std=c++14 -pedantic) 说
prog.cc:10:52: error: expansion pattern 'f<Ts>' contains no argument packs
template <typename ... Ts, bool F = fn::call(f<Ts> ...)>
clang 3.6.0 和 3.5.0 没有错误。
我和 clang 是否违反了 c++ 规则或者这是一个 gcc 错误?
您没有违反任何规则。这似乎是 GCC 对变量模板的支持的问题,而不仅仅是默认参数,因为此调整有效:
template <typename ... T>
struct f {
static constexpr bool v = false;
};
template <typename ... Ts, bool F = fn::call(f<Ts>::v ...)>
void hoge () {}
http://coliru.stacked-crooked.com/a/ff81b6ab052a748b
据我所知,变量模板相当于包装静态成员的 class 模板,因此除了需要编写 ::v
.
以下代码使用 clang 编译成功,但 gcc 失败:
struct fn
{
template <typename ... Args>
static constexpr bool call (Args ... ) { return true; }
};
template <typename ... T>
static constexpr bool f = false;
template <typename ... Ts, bool F = fn::call(f<Ts> ...)>
void hoge () {}
int main () {}
gcc 5.1.0 (-Wall -Wextra -std=c++14 -pedantic) 说
prog.cc:10:52: error: expansion pattern 'f<Ts>' contains no argument packs
template <typename ... Ts, bool F = fn::call(f<Ts> ...)>
clang 3.6.0 和 3.5.0 没有错误。
我和 clang 是否违反了 c++ 规则或者这是一个 gcc 错误?
您没有违反任何规则。这似乎是 GCC 对变量模板的支持的问题,而不仅仅是默认参数,因为此调整有效:
template <typename ... T>
struct f {
static constexpr bool v = false;
};
template <typename ... Ts, bool F = fn::call(f<Ts>::v ...)>
void hoge () {}
http://coliru.stacked-crooked.com/a/ff81b6ab052a748b
据我所知,变量模板相当于包装静态成员的 class 模板,因此除了需要编写 ::v
.