Поддерживается ли constexpr с лямбда-функциями/выражениями?
struct Test
{
static const int value = []() -> int { return 0; } ();
};
С gcc-4.6 я получаю что-то вроде error: function needs to be constexpr
. Я попробовал несколько комбинаций размещения constexpr
в разных местах, но не повезло.
Поддерживается ли constexpr
для лямбда-функций (независимо от того, какой тип return
указан или нет)? Каков правильный синтаксис?
Возможна любая работа?
Ответы
Ответ 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