比较clang 3.4.2和gcc 4.9,这对于以下代码是否正确?
#include <iostream>
template<typename T>
struct SelfRec {
static const int value = SelfRec<T>::value;
};
int main() {
std::cout << SelfRec<int>::value << std::endl;
return 0;
}
clang print 0,gcc给出典型的模板最大深度误差。
答案 0 :(得分:3)
这样的代码有什么意义?你说Clang打印0,鉴于它编译,这并不令人震惊,但零是什么意思?它来自哪里?
请注意,static const int value
不是全局静态变量,而是存在于每个T
。并且有无限多的T
s,所以值确实应该永远递归。我没有责怪GCC没有编译它,事实上它可能是最好的。
答案 1 :(得分:2)
根据§14.7.2/ 15,这是未定义的行为:
15 有一个实现定义的数量,用于指定 限制递归实例的总深度,可以 涉及多个模板。无限递归的结果 实例化未定义。
所以我同意user657267,任何一个编译器都可以“正确”。虽然我使用的是标准的n3337,但我从hacker news得到了答案。