提问者:小点点

如何在C中显式实例化模板constepr变量?


如果一个人有一个模板参数变量(例如,用于计算斐波那契序列),并且想为一些模板参数实例化它,那么在实例化过程中必须重复Constexpr关键字吗?

template<int N> constexpr size_t fib = fib<N-1> + fib<N-2>;
template<> constexpr size_t fib<1> = 1;
template<> constexpr size_t fib<2> = 1;

//template constexpr size_t fib<70>; // GCC error
template size_t fib<70>; // Clang error

这里的问题是GCC坚持删除关键字:

error: explicit instantiation shall not use 'constexpr' specifier

而叮当坚持要保留它:

error: type 'size_t' (aka 'unsigned long') of explicit instantiation of 'fib' does not match expected type 'const size_t' (aka 'const unsigned long')

演示:https://gcc.godbolt.org/z/f6rMjz95E

根据标准,这里哪个编译器是正确的?


共1个答案

匿名用户

这可能是一个叮当作响的错误。从临时工。明确的#3

... 函数模板、类模板的成员函数或变量模板的显式实例化不得使用内联consteprconsteval说明符。

(强调矿山)

这正是GCC错误消息所说的。

clang的错误消息表示显式实例化中缺少const,并添加

template size_t const fib<70>;  // ok everywhere

也允许Clang编译代码。