Constexpr лямбда по умолчанию?

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

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

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

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

person Aahzbg    schedule 30.08.2016    source источник


Ответы (1)


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

  2. Спросил и ответил.

person Nicol Bolas    schedule 30.08.2016