C++ lambda函数的静态数组(C+;+;)
我想这样做(在课堂上): 其中C++ lambda函数的静态数组(C+;+;),c++,c++11,lambda,C++,C++11,Lambda,我想这样做(在课堂上): 其中MyStruct定义为: typedef double (*binOp)(double, double); struct MyStruct { char c; binOp fn; }; 我还尝试: std::function <double(double,double)> fn; std::函数fn; 关于fn的定义,但没有运气 对于第一种情况,我得到的错误是“error:fieldinitializer不是常量”,我没有真正得到。
MyStruct
定义为:
typedef double (*binOp)(double, double);
struct MyStruct {
char c;
binOp fn;
};
我还尝试:
std::function <double(double,double)> fn;
std::函数fn;
关于fn
的定义,但没有运气
对于第一种情况,我得到的错误是“error:fieldinitializer不是常量”,我没有真正得到。如果我尝试使用std::function
,情况会变得更糟,因为它说:“在声明时不能由非常量表达式初始化”
为什么lambda函数是非常数的?我遗漏了什么吗?捕获lambda无法衰减为函数指针
从(非捕获)lambda返回函数指针的运算符不是
constexpr
当构造constexpr
对象时,传递给它的所有内容都需要是核心常量表达式[decl.constexpr]/9:
对象声明中使用的constepr
说明符将对象声明为const
。这种物体应具有
应初始化文本类型和。如果它由构造函数调用初始化,该调用应为常量表达式(5.19)
从[expr.const]可知,lambda不是常数表达式1:
条件表达式e是一个核心常量表达式,除非根据
抽象机器(1.9)将计算以下表达式之一:
- [……]
- λ表达式(5.1.2)李>
- [……]
constepr
,而不适用于const
,因此您可以简单地执行以下操作:
static const MyStruct ops[6] = {
{'+', [] (double a, double b) { return a+b; } },
{'-', [] (double a, double b) { return a-b; } },
};
注意:您的lambda不需要捕获任何内容,因此您应该清空捕获列表[]
1正如所指出的,有人建议对此进行更改:将
constexpr
替换为const
。lambda表达式目前可能不会出现在常量表达式中,但该限制可能最终会被删除:从C++17,请注意,lambda现在可以是constexpr:还请注意,lambda通过引用捕获其范围内的所有内容。目前,它们不使用任何东西,所以这不是问题,但捕获lambda不能转换为原始函数指针。
static const MyStruct ops[6] = {
{'+', [] (double a, double b) { return a+b; } },
{'-', [] (double a, double b) { return a-b; } },
};