14

我正在分配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 错误(我使用的是 4.7.2)吗?否则为什么标准中有这个限制?

4

2 回答 2

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); });

但实际上,使用if/更清洁else

于 2012-10-17T19:43:21.437 回答
-1

也面临这个问题 - 不会编译!

'if/else' 对我不好,我想打开自动类型推断功能。

    auto memcpy_traits = 
        [&](uint8_t* line_dst, const uint8_t* curr_src, const size_t bytes_to_copy) {
            std::memcpy(line_dst, curr_src, bytes_to_copy);
            line_dst += bytes_to_copy;
            curr_src += bytes_to_copy;
    }
    :
     [&](uint8_t* line_dst, const uint8_t* curr_src, const size_t bytes_to_copy) {
     std::memcpy(line_dst, curr_src, bytes_to_copy);
     line_dst += bytes_to_copy;
     curr_src += bytes_to_copy;
     };
于 2019-10-18T12:00:05.450 回答