gcc因模板递归而失败,而clang则没有

时间:2014-09-03 13:51:49

标签: c++ templates recursion clang gcc4.9

比较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给出典型的模板最大深度误差。

2 个答案:

答案 0 :(得分:3)

这样的代码有什么意义?你说Clang打印0,鉴于它编译,这并不令人震惊,但零是什么意思?它来自哪里?

请注意,static const int value不是全局静态变量,而是存在于每个T。并且有无限多的T s,所以值确实应该永远递归。我没有责怪GCC没有编译它,事实上它可能是最好的。

答案 1 :(得分:2)

根据§14.7.2/ 15,这是未定义的行为:

  

15   有一个实现定义的数量,用于指定   限制递归实例的总深度,可以   涉及多个模板。无限递归的结果   实例化未定义。

所以我同意user657267,任何一个编译器都可以“正确”。虽然我使用的是标准的n3337,但我从hacker news得到了答案。