Я часто слышу о том, что «исходники на C ++ отнимают много времени и памяти».
Я также слышал о том, что шаблон C ++ завершен по Тьюрингу, поэтому он может пострадать от Проблема остановки.
Я также создал C ++ проект, который стоит 8 ГБ памяти и 2 часа времени.
Итак, вопрос в следующем: Есть ли код C ++, который компилируется за бесконечное время?
(Вложенные включения или шаблоны могут быть обнаружены, поэтому они не должны учитываться.)
Связанный вопрос: Есть ли код C ++, который компилируется с бесконечной памятью? (Я разделил их, так как я ожидаю другого ответа.)
теоретически это будет компилироваться за «бесконечное» время, потому что расширение шаблона бесконечно рекурсивно:
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;
}