Почему все компиляторы C ++ взламывают sh или зависают от этого кода? - PullRequest
8 голосов
/ 21 февраля 2020

Следующий фрагмент кода аварийно завершает работу или зависает до исчерпания памяти при компиляции каждым протестированным мной компилятором 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, чтобы компилятор не исчерпал вашу память. Мне приходилось несколько раз сильно перезагружаться, играя с этим.

...