Никакая Выполнимая Ошибка методов От Основного Тестового класса

РЕДАКТИРОВАТЬ: игнорировать этот ответ. Ссылочная статья устарела. Стандарт допускает ограниченную рекурсию (см. Комментарии).

Обе формы являются незаконными. Рекурсия не разрешена в функциях constexpr из-за ограничения, что функция constexpr не может быть вызвана, пока она не определена. Ссылка, предоставленная OP, утверждает это в явном виде:

constexpr int twice(int x);
enum { bufsz = twice(256) }; // error: twice() isn’t (yet) defined

constexpr int fac(int x)
{ return x > 2 ? x * fac(x - 1) : 1; } // error: fac() not defined
                                       // before use

Несколько строчек ниже:

Требование, чтобы функция с постоянным выражением могла вызывать только ранее определенные функции с постоянным выражением гарантирует, что у нас не возникнет никаких проблем, связанных с рекурсией.

...

Мы (до сих пор) запрещаем рекурсию во всех ее формах в константных выражениях.

Без этих ограничений вы впутываетесь в проблему остановки (спасибо @Grant за потрясение моей памятью с вашим комментарием к моему другому ответу). Вместо того, чтобы устанавливать произвольные пределы рекурсии, дизайнеры посчитали более простым просто сказать «Нет».

30
задан Alex B 25 August 2009 в 19:10
поделиться