【发布时间】:2015-05-29 11:01:10
【问题描述】:
我想做这样的事情(在课堂上):
static constexpr MyStruct ops[6] = {
{'+', [&] (double a, double b) { return a+b; } },
{'-', [&] (double a, double b) { return a-b; } },
...
};
其中MyStruct定义为:
typedef double (*binOp)(double, double);
struct MyStruct {
char c;
binOp fn;
};
我也试过了:
std::function <double(double,double)> fn;
对于fn的定义,但没有运气。
我在第一种情况下得到的错误是 "error: field initializer is not constant" 我并没有真正得到。如果我尝试使用std::function,它会变得更糟,因为它说:“在声明时不能由非常量表达式初始化”。
为什么 lambda 函数是非常量的?我错过了什么吗?
【问题讨论】:
-
将
constexpr替换为const。 -
lambda 表达式目前可能不会出现在常量表达式中,但该限制最终可能会被删除:isocpp.org/files/papers/N4487.pdf
-
从 C++17 开始,请注意 lambdas 现在可以是 constexpr:stackoverflow.com/questions/6420085/…
-
还请注意您的 lambda 通过引用捕获其范围内的所有内容。目前他们不使用任何东西,所以这不是问题,但捕获 lambda 不能转换为原始函数指针。