三元运算符不适用于 lambda 函数

Posted

技术标签:

【中文标题】三元运算符不适用于 lambda 函数【英文标题】:ternary operator doesn't work with lambda functions 【发布时间】:2012-10-08 03:51:06 【问题描述】:

我正在为 std::function<double()> 分配一个 lambda 表达式。这个 sn-p 有效

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)?不然为什么标准里有这个限制?

【问题讨论】:

【参考方案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;
     ;

【讨论】:

这不是答案。请删除它,然后提出一个新问题。【参考方案2】:

条件运算符的第二个和第三个操作数必须具有相同的类型,或者必须有某种共同的类型,它们都可以转换为编译器可以识别的类型。编译器只会考虑少数几种转换。

您的两个 lambda 表达式具有不同的类型,并且没有可以将它们都转换为的通用类型(不能考虑转换为用户定义的类型,例如 std::function&lt;double()&gt;,因为可能存在无限数量的有效目标类型)。

您可以直接将每个操作数转换为std::function&lt;double()&gt;

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 更简洁。

【讨论】:

+1 表示答案,另一个 +1 表示“使用 if/else 更简洁。” 这是一个相关案例,由于某种原因,它在 clang 和 gcc 上编译,但在 MSVC 上没有:godbolt.org/z/4YQdVA 我认为,这根本不应该编译,因为 : 的两侧有不同种类。知道为什么它会编译吗?谁是对的,MSVC 还是 clang & gcc?

以上是关于三元运算符不适用于 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

Python 函数进阶-lambda匿名函数和三元运算符

为啥三元条件不适用于字符串连接

Python-三元运算符和lambda表达式

三元运算&匿名函数lambda

Python-函数式编程-map reduce filter lambda 三元表达式 闭包

三元运算lambda表达式