шаблоны — есть ли код C ++, который компилируется за бесконечное время?

Я часто слышу о том, что «исходники на C ++ отнимают много времени и памяти».

Я также слышал о том, что шаблон C ++ завершен по Тьюрингу, поэтому он может пострадать от Проблема остановки.

Я также создал C ++ проект, который стоит 8 ГБ памяти и 2 часа времени.

Итак, вопрос в следующем: Есть ли код C ++, который компилируется за бесконечное время?

(Вложенные включения или шаблоны могут быть обнаружены, поэтому они не должны учитываться.)

Связанный вопрос: Есть ли код C ++, который компилируется с бесконечной памятью? (Я разделил их, так как я ожидаю другого ответа.)

-1

Решение

теоретически это будет компилироваться за «бесконечное» время, потому что расширение шаблона бесконечно рекурсивно:

template <size_t N>
struct eat
{
static constexpr size_t value = eat<N+1>::value;
};

Тем не менее, все компиляторы, которые я использовал, защищаются от такого рода кода, выдавая ошибку, подобную этой:

/Users/richardh/Documents/dev/Scratchpad/tryit/tryit/words.cpp:136:37: fatal error: recursive template instantiation exceeded maximum depth of 256
static constexpr size_t value = eat<N+1>::value;
^
/Users/richardh/Documents/dev/Scratchpad/tryit/tryit/words.cpp:136:37: note: in instantiation of template class 'eat<257>' requested here
static constexpr size_t value = eat<N+1>::value;
^
/Users/richardh/Documents/dev/Scratchpad/tryit/tryit/words.cpp:136:37: note: in instantiation of template class 'eat<256>' requested here
static constexpr size_t value = eat<N+1>::value;
^
/Users/richardh/Documents/dev/Scratchpad/tryit/tryit/words.cpp:136:37: note: in instantiation of template class 'eat<255>' requested here
static constexpr size_t value = eat<N+1>::value;
^
/Users/richardh/Documents/dev/Scratchpad/tryit/tryit/words.cpp:136:37: note: in instantiation of template class 'eat<254>' requested here
static constexpr size_t value = eat<N+1>::value;

…так далее

РЕДАКТИРОВАТЬ:
хорошо, я думаю, что этот действительно бесконечен:

template <class T>
struct eat2
{
using inner = eat2<eat2<T>>;
static constexpr int value() {
return inner::value();
}
};

int main()
{
eat2<int> e;
cout << e.value() << endl;
return 0;
}
8

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


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