gcc не работает с рекурсией шаблона, а clang — нет

Сравнивая 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 выдает типичную ошибку максимальной глубины шаблона.

3

Решение

В чем может быть смысл такого кода? Вы говорите, что Clang печатает 0, что не шокирует, учитывая, что он скомпилирован, но что означает ноль? Откуда это?

Обратите внимание, что static const int value не является глобальной статической переменной, но существует для каждого T, И их бесконечно много Tс, так что ценность должна действительно возвращаться навсегда. Я не виню GCC за то, что он не скомпилировал это, на самом деле это, вероятно, к лучшему.

3

Другие решения

Согласно § 14.7.2 / 15 это неопределенное поведение:

15
Существует определенное для реализации количество, которое определяет
ограничение на общую глубину рекурсивных инстанций, которые могли бы
задействовать более одного шаблона. Результатом бесконечной рекурсии в
экземпляр не определен.

Поэтому я согласен с user657267, что любой компилятор может быть «правильным». Я получил ответ от хакерские новости хотя я использую стандарт n3337.

2

По вопросам рекламы [email protected]