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

Fed*_*dor 4 c++ language-lawyer constexpr explicit-instantiation

如果有一个模板 constexpr 变量(例如用于计算斐波那契数列)并且想要为某些模板参数实例化它,则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
Run Code Online (Sandbox Code Playgroud)

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

error: explicit instantiation shall not use 'constexpr' specifier
Run Code Online (Sandbox Code Playgroud)

而 Clang 坚持保留它:

error: type 'size_t' (aka 'unsigned long') of explicit instantiation of 'fib' does not match expected type 'const size_t' (aka 'const unsigned long')
Run Code Online (Sandbox Code Playgroud)

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

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

cig*_*ien 5

这可能是一个 Clang 错误。来自temp.explicit#3

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

(强调我的)

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

Clang 的错误消息表const明显式实例化中缺少该内容,并添加了该内容

template size_t const fib<70>;  // ok everywhere
Run Code Online (Sandbox Code Playgroud)

也允许 Clang编译代码。