gcc不接受默认模板参数

时间:2015-05-12 02:40:15

标签: c++ c++11 gcc clang

以下代码使用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错误?

1 个答案:

答案 0 :(得分:4)

您没有违反任何规则。 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之外,这不会引起任何问题。