Ответ 1
-
Квалификатор
constexpr
делает ошибку компиляции для лямбда нарушением требований функцийconstexpr
. Вы используете его, когда вам явно требуется, чтобы лямбда былаconstexpr
, чтобы вы случайно не сделали это неconstexpr
.
Согласно n4487 и другим ссылкам на С++ 17, появится новый спецификатор лямбда-функции - constexpr
, который, если присутствует "явно указывает, что оператор вызова функции является функцией constexpr
.". Я понимаю мотивацию постоянных выражений в лямбдах. Что интересно для меня, это пункт 4 предложения, в котором говорится:
4) Если спецификатор
constexpr
не указан в лямбда-деклараторе, оператор (или шаблон) вызова функции являетсяconstexpr
, если он удовлетворяет требованиям функцииconstexpr
.
Это приводит меня к двум вопросам:
constexpr
? Похоже, что оператор лямбда-вызова будет constexpr
или не зависит только от того, будет ли он "удовлетворять требованиям функции constexpr
", но не от присутствия спецификатора constexpr
.constexpr
лямбда по умолчанию, почему он не предлагается и для других типов функций - например, глобальных функций? Каким будет влияние, если компилятор начнет рассматривать все функции, которые покрывают требования как constexpr
?Квалификатор constexpr
делает ошибку компиляции для лямбда нарушением требований функций constexpr
. Вы используете его, когда вам явно требуется, чтобы лямбда была constexpr
, чтобы вы случайно не сделали это не constexpr
.