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
根据标准,哪个编译器是正确的?
这可能是一个 Clang 错误。来自temp.explicit#3
...函数模板、类模板的成员函数或变量模板的显式实例化不得使用
inline、constexpr或consteval说明符。
(强调我的)
这正是 GCC 错误消息所说的内容。
Clang 的错误消息表const明显式实例化中缺少该内容,并添加了该内容
template size_t const fib<70>; // ok everywhere
Run Code Online (Sandbox Code Playgroud)
也允许 Clang编译代码。
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |