Ответ 1
Когда вы создаете объект constexpr
, все, что вы передаете в него, должно быть основным константным выражением, [decl.constexpr]/9:
A
constexpr
спецификатор, используемый в объявлении объекта, объявляет объект какconst
. Такой объект должен иметь буквальный тип и должен быть инициализирован. Если он инициализируется вызовом конструктора, , то вызов должен быть постоянным выражением (5.19).
и, из [expr.const] lambdas не являются постоянными выражениями 1:
Условное выражение e является выражением постоянной константы, если оценка e, следуя правилам абстрактная машина (1.9), оценила бы одно из следующих выражений:
- [...]
- лямбда-выражение (5.1.2);
- [...]
Однако это относится только к constexpr
, а не к const
, поэтому вы можете просто сделать это:
static const MyStruct ops[6] = {
{'+', [] (double a, double b) { return a+b; } },
{'-', [] (double a, double b) { return a-b; } },
};
Примечание: вашим лямбдам не нужно ничего захватывать, поэтому вам нужно просто пустой список захвата []
.
1 Как указано dyp, есть предложение изменить это: N4487