如何在 C++ 中显式实例化模板 constexpr 变量?
How to make explicit instantiation of template constexpr variable in C++?
如果有一个模板 constexpr 变量(例如,用于计算 Fibonacci 数列)并且想为某个模板参数实例化它,在实例化期间是否必须重复 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
而 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')
演示:https://gcc.godbolt.org/z/f6rMjz95E
根据标准,这里哪个编译器是正确的?
这可能是一个 Clang 错误。来自 temp.explicit#3
... An explicit instantiation of a function template, member function of a class template, or variable template shall not use the inline
, constexpr
, or consteval
specifiers.
(强调我的)
这正是 GCC 错误消息所说的内容。
Clang 的错误消息说显式实例化中缺少 const
,并添加
template size_t const fib<70>; // ok everywhere
也允许 Clang compile 代码。
如果有一个模板 constexpr 变量(例如,用于计算 Fibonacci 数列)并且想为某个模板参数实例化它,在实例化期间是否必须重复 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
而 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')
演示:https://gcc.godbolt.org/z/f6rMjz95E
根据标准,这里哪个编译器是正确的?
这可能是一个 Clang 错误。来自 temp.explicit#3
... An explicit instantiation of a function template, member function of a class template, or variable template shall not use the
inline
,constexpr
, orconsteval
specifiers.
(强调我的)
这正是 GCC 错误消息所说的内容。
Clang 的错误消息说显式实例化中缺少 const
,并添加
template size_t const fib<70>; // ok everywhere
也允许 Clang compile 代码。