РЕДАКТИРОВАТЬ: игнорировать этот ответ. Ссылочная статья устарела. Стандарт допускает ограниченную рекурсию (см. Комментарии).
Обе формы являются незаконными. Рекурсия не разрешена в функциях 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 за потрясение моей памятью с вашим комментарием к моему другому ответу). Вместо того, чтобы устанавливать произвольные пределы рекурсии, дизайнеры посчитали более простым просто сказать «Нет».
Сделайте родительский класс абстрактным
или переименуйте его так, чтобы он не оканчивался на Test
или TestCase
.