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

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам