Сравнивая 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 выдает типичную ошибку максимальной глубины шаблона.
В чем может быть смысл такого кода? Вы говорите, что Clang печатает 0, что не шокирует, учитывая, что он скомпилирован, но что означает ноль? Откуда это?
Обратите внимание, что static const int value
не является глобальной статической переменной, но существует для каждого T
, И их бесконечно много T
с, так что ценность должна действительно возвращаться навсегда. Я не виню GCC за то, что он не скомпилировал это, на самом деле это, вероятно, к лучшему.
Согласно § 14.7.2 / 15 это неопределенное поведение:
15
Существует определенное для реализации количество, которое определяет
ограничение на общую глубину рекурсивных инстанций, которые могли бы
задействовать более одного шаблона. Результатом бесконечной рекурсии в
экземпляр не определен.
Поэтому я согласен с user657267, что любой компилятор может быть «правильным». Я получил ответ от хакерские новости хотя я использую стандарт n3337.