Следующий фрагмент кода аварийно завершает работу или зависает до исчерпания памяти при компиляции каждым протестированным мной компилятором C ++:
#include <tuple>
template<class... Ts>
auto f(Ts... ts){
return f(std::make_tuple(ts...));
}
auto a = f();
Протестировано на различных версиях G CC, Clang, MSV C , i cc, ELL CC: https://godbolt.org/z/cwqiZK
Мой вопрос: почему это не учитывается пределами глубины шаблона или подобными мерами безопасности, которые реализуют эти компиляторы? Я нашел несколько примеров кода , таких как этот старый пример , которые приводят к зависанию компиляторов, но кажется, что все проблемы, которые я мог найти, были исправлены, так как он стал стандартным для ограничения глубины создания шаблона.
Следует отметить, что это не уникально для make_tuple
и работает для tie
, forward_as_tuple
... et c.
Как предупреждение, если вы попробуйте скомпилировать это локально, обязательно используйте что-то вроде ulimit
, чтобы компилятор не исчерпал вашу память. Мне приходилось несколько раз сильно перезагружаться, играя с этим.