3

比较 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 打印 0,gcc 给出典型的达到模板最大深度错误。

4

2 回答 2

3

这样的代码可能是什么意思?您说 Clang 打印 0,考虑到它已编译,这并不令人震惊,但零是什么意思?它从哪里来的?

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

于 2014-09-03T13:59:08.127 回答
2

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

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

所以我同意 user657267 的任何一个编译器都可以是“正确的”。尽管我使用标准的 n3337,但我从黑客新闻中得到了答案。

于 2014-09-03T14:02:20.837 回答