2016-08-30 2 views
10

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

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

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

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

ответ

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

  2. Asked and answered.