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

Поддерживается ли constexpr с лямбда-функциями/выражениями?

struct Test
{
  static const int value = []() -> int { return 0; } ();
};

С gcc-4.6 я получаю что-то вроде error: function needs to be constexpr. Я попробовал несколько комбинаций размещения constexpr в разных местах, но не повезло.

Поддерживается ли constexpr для лямбда-функций (независимо от того, какой тип return указан или нет)? Каков правильный синтаксис?

Возможна любая работа?

4b9b3361

Ответ 1

Обновление: с С++ 17 разрешены lambdas в постоянных выражениях.


Lambdas в настоящее время (С++ 14) не разрешены в постоянных выражениях в соответствии с [expr.const]/(2.6), но они будут когда-то N4487 (который можно найти в рабочем проекте N4582):

В этом предложении предлагается использовать лямбда-выражения в постоянных выражения, устраняющие существующее ограничение. Авторы предлагают что некоторые лямбда-выражения и операции над некоторым замыканием объекты могут отображаться в постоянных выражениях. При этом, мы также предлагаем, чтобы тип замыкания считался буквенным типом, если тип каждого из его элементов данных является буквальным типом; и, если спецификатор constexpr не указывается в лямбда-деклараторе, что сгенерированный оператор вызова функции constexpr, если он удовлетворяет требования функции constexpr (аналогичные constexpr, который уже встречается для неявно определенных конструкторы и функции оператора присваивания).

Ответ 2

Из С++ 0x FDIS §7.1.5 [dcl.constexpr]/1:

Спецификатор constexpr должен применяться только к определению переменной, объявлению функции или шаблону функции или объявлению статического элемента данных литерала.

Лямбда-выражение не является ничем из этих вещей и поэтому не может быть объявлено constexpr.

Ответ 3

До С++ 17 lambdas не совместимы с constexpr. Они не могут использоваться внутри постоянных выражений.

Начиная с С++ 17 lambdas constexpr, где это имеет смысл. Предложение N4487 будет помещено в стандарт С++ 17. На его веб-сайт Херб Саттер, председатель комитета ISO С++, заявил следующее:

Lambdas теперь разрешены внутри функций constexpr.

Ответ 4

FFWD до 2018 года:)

auto my_const_expression_lambda = []()
  constexpr -> bool
{
   return true ;
}

Так как С++ 17