考虑以下示例:
#include <cstdio>
template <int N>
int fib = fib<N - 1> + fib<N - 2>;
template <> int fib<2> = 1;
template <> int fib<1> = 1;
int main()
{
std::printf("%d %d %d", fib<4>, fib<5>, fib<6>);
}
GCC 7.x、8.x、9.x 和 10.x 都打印出
3 5 8
.Clang 5.x、6.x、7.x、8.x、9.x 和 10.x 都会
1 3 4
作为结果打印出来。
Clang 的行为令人惊讶。
我缺少的 C++ 标准中的变量模板实例化、全局变量和递归之间是否存在任何微妙的交互?
或者这是一个长期存在的 Clang 错误?
顺便说一句,标记fib
为constexpr
解决了这个问题(在 godbolt.org 上)。