Функция constexpr должна иметь одно значение аргумента?
Согласно this, функция, объявленная с помощью constexpr
, должна удовлетворять нескольким требованиям, один из которых выглядит следующим образом:
существует по крайней мере одно значение аргумента, так что вызов функции может быть оцененным подвыражением выражения константы ядра...
constexpr
функция не может иметь никаких аргументов:
constexpr int Bar( /* empty */ ) { return 0xFF; }
constexpr int value = Bar(); // Valid expression
Функция
constexpr
, которая вызывается как подпрограмма, не может определить, что все выражение также является основным постоянным выражением.
Так что же означает значение одного аргумента?
[Обновить для будущих читателей]
По-видимому, описание требований constexpr function
было исправлено, поскольку этот вопрос:
существует по крайней мере одно значение аргумента, так что вызов функции может быть оцененным подвыражением выражения константы ядра...
в
существует по крайней мере один набор значений аргументов, так что вызов функции может быть оцененным подвыражением выражения константы ядра...
Ответы
Ответ 1
Цитата из en.cppreference.com неточна в отношении стандарта, настоящая цитата: (& sect; 7.1.5/5):
Для функции constexpr
или конструктора constexpr
, который не является ни дефолтом, ни шаблоном, если значения аргументов не существуют, так что вызов функции или конструктора может быть оцененным подвыражением основного константного выражения (5.20) [...] программа плохо сформирована; не требуется диагностика.
Что в основном говорит, что должен существовать один правильный набор аргументов (пустое множество является допустимым в вашем случае).
Ответ 2
"Значение одного аргумента" здесь означает "один набор аргументов". У ненужных функций есть один возможный набор аргументов, пустое множество.
В вашем случае этот единственный пустой набор аргументов приводит к действительному вызову constexpr
, поэтому все в порядке.