Подтвердить что ты не робот

Функция constexpr должна иметь одно значение аргумента?

Согласно this, функция, объявленная с помощью constexpr, должна удовлетворять нескольким требованиям, один из которых выглядит следующим образом:

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

constexpr функция не может иметь никаких аргументов:

constexpr int Bar( /* empty */ ) { return 0xFF; }
constexpr int value = Bar(); // Valid expression
Функция

constexpr, которая вызывается как подпрограмма, не может определить, что все выражение также является основным постоянным выражением.

Так что же означает значение одного аргумента?

[Обновить для будущих читателей]

По-видимому, описание требований constexpr function было исправлено, поскольку этот вопрос:

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

в

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

4b9b3361

Ответ 1

Цитата из en.cppreference.com неточна в отношении стандарта, настоящая цитата: (& sect; 7.1.5/5):

Для функции constexpr или конструктора constexpr, который не является ни дефолтом, ни шаблоном, если значения аргументов не существуют, так что вызов функции или конструктора может быть оцененным подвыражением основного константного выражения (5.20) [...] программа плохо сформирована; не требуется диагностика.

Что в основном говорит, что должен существовать один правильный набор аргументов (пустое множество является допустимым в вашем случае).

Ответ 2

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

В вашем случае этот единственный пустой набор аргументов приводит к действительному вызову constexpr, поэтому все в порядке.