gcc不接受默认模板参数中的包扩展

以下代码与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> ...)>

铿锵3.6.0和3.5.0没有错误。

我和铿锵违反C ++规则,或者这是一个海湾合作委员会的错误?


你没有违反任何规则。 这似乎是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

据我所知,变量模板相当于包装静态成员的类模板,所以除了需要编写::v之外,这不应该引起任何问题。

链接地址: http://www.djcxy.com/p/85191.html

上一篇: gcc doesn't accept pack expansion in default template argument

下一篇: Have a button execute OnClickListener on end of ripple animation(Material theme)