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

Constexpr lambda по умолчанию?

Согласно n4487 и другим ссылкам на С++ 17, появится новый спецификатор лямбда-функции - constexpr, который, если присутствует "явно указывает, что оператор вызова функции является функцией constexpr.". Я понимаю мотивацию постоянных выражений в лямбдах. Что интересно для меня, это пункт 4 предложения, в котором говорится:

4) Если спецификатор constexpr не указан в лямбда-деклараторе, оператор (или шаблон) вызова функции является constexpr, если он удовлетворяет требованиям функции constexpr.

Это приводит меня к двум вопросам:

  • Зачем нам нужен спецификатор constexpr? Похоже, что оператор лямбда-вызова будет constexpr или не зависит только от того, будет ли он "удовлетворять требованиям функции constexpr", но не от присутствия спецификатора constexpr.
  • Если допустимо иметь constexpr лямбда по умолчанию, почему он не предлагается и для других типов функций - например, глобальных функций? Каким будет влияние, если компилятор начнет рассматривать все функции, которые покрывают требования как constexpr?
4b9b3361

Ответ 1

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

  • Отвечено на вопрос и отвечает.