Вероятно, они должны быть в разных вопросах, но они связаны так...
-
Зачем нам вообще писать
constexpr
? Учитывая набор ограничений, компилятор не смог оценить код, чтобы убедиться в том, удовлетворяет ли он требованиямconstexpr
и обрабатывает его какconstexpr
, если он делает?. В качестве чисто документационного ключевого слова я не уверен, что он содержит потому что я не могу придумать случай, когда мне (пользователю какой-то функцииconstexpr
) по-настоящему нужно, чтобы оно выполнялось или не выполнялось.Вот моя логика: если это дорогостоящая функция, я думаю, что в качестве хорошей практики я должен рассматривать ее как таковую, независимо от того, могу ли я давать ей постоянный ввод времени компиляции или нет. Это может означать вызов его во время загрузки и сохранение результата, а не вызов его в критический момент выполнения. Причина в том, что
constexpr
на самом деле не гарантирует мне, что он не будет выполняться во время выполнения в первую очередь - так, возможно, это должен сделать новый/другой механизм. -
Ограничения
constexpr
, похоже, исключают многие, если не большинство, функции из оценки времени компиляции, которые логически могут быть. Я читал это, по крайней мере, частично (или, возможно, полностью?), чтобы предотвратить бесконечный цикл и зависание компилятора. Но, если это причина, это законно?
Не следует ли компилятору вычислить, если для любой заданной функции constexpr
с указанными входами она бесконечно петляет? Это не решает проблему остановки для любого ввода. Вход в функцию constexpr
- это константа времени компиляции и конечная, поэтому компилятору нужно только проверять бесконечный цикл для конечного набора входных данных: фактически используемый вход. Должна быть регулярная ошибка компиляции, если вы пишете бесконечный цикл времени компиляции.