Поддерживается ли constexpr лямбда-функциями / выражениями? - PullRequest
51 голосов
/ 21 июня 2011
struct Test
{
  static const int value = []() -> int { return 0; } ();
};

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

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

Возможен ли обходной путь?

Ответы [ 4 ]

26 голосов
/ 21 сентября 2015

Обновление : Начиная с C ++ 17, лямбда-выражения разрешены в константных выражениях.


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

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

25 голосов
/ 21 июня 2011

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

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

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

10 голосов
/ 09 августа 2016

До C ++ 17 лямбды не совместимы с constexpr. Их нельзя использовать внутри константных выражений .

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

Лямбды теперь разрешены внутри функций constexpr .

3 голосов
/ 24 февраля 2018

FFWD к 2018 году:)

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

С c ++ 17

...