三元运营商不与拉姆达职能的工作(ternary operator doesn't work

2019-08-01 14:12发布

我分配给一个std::function<double()> lambda表达式。 该段工程

if(fn_type==exponential)
    k.*variable = [=,&k](){ return initial*exp(-k.kstep*par); };
else
    k.*variable = [=,&k](){ return initial*pow(k.kstep, par); };

而如果我想使用三元运算

k.*variable = (fn_type==exponential ? [=,&k](){ return initial*exp(-k.kstep*par); } : [=,&k](){ return initial*pow(k.kstep, par); });

我得到以下错误:

error: no match for ternary ‘operator?:’ in <awfully long template error, because this whole thing is in a class defined in a function...>

这是一个gcc的bug(我用4.7.2)? 否则,为什么会有这个限制的标准是什么?

Answer 1:

条件运算符的所述第二和第三操作数必须具有相同类型或必须有一些常见的类型,其它们可以同时被转换,编译器可以计算出。 只有编译器会考虑转换了一把。

你的两个lambda表达式有不同的类型,且有它们都可以被转换(转换到用户定义的类型没有常见的类型,像std::function<double()> ,不能被认为是因为有可能的无限数量有效的目标类型)。

你可以直接转换成每个操作数的对std::function<double()>

k.*variable = fn_type==exponential
    ? std::function<double()>([=,&k](){ return initial*exp(-k.kstep*par); })
    : std::function<double()>([=,&k](){ return initial*pow(k.kstep, par); });

但实际上,它是用清洁剂if / else



文章来源: ternary operator doesn't work with lambda functions