Lor*_*one 14 c++ lambda conditional-operator c++11
我正在分配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); };
Run Code Online (Sandbox Code Playgroud)
而如果我想使用三元运算符
k.*variable = (fn_type==exponential ? [=,&k](){ return initial*exp(-k.kstep*par); } : [=,&k](){ return initial*pow(k.kstep, par); });
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: no match for ternary ‘operator?:’ in <awfully long template error, because this whole thing is in a class defined in a function...>
Run Code Online (Sandbox Code Playgroud)
这是一个gcc bug(我使用的是4.7.2)?否则为什么标准中有这个限制?
Jam*_*lis 19
条件运算符的第二个和第三个操作数必须具有相同的类型,或者必须存在一些可以转换的公共类型,编译器可以根据这些类型进行转换.编译器只会考虑少数转换.
您的两个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); });
Run Code Online (Sandbox Code Playgroud)
但实际上,if/ 更干净了else.