从函数返回lambda表达式的返回值有什么意义?

问题描述

自C ++ 17 it is possible开始在constexpr函数中使用lambda表达式。

在相关文档Wording for constexpr lambda显示了此代码示例:

constexpr int AddEleven(int n) {
    return [n] { return n + 11; }();
}

这仅仅是一个展示语言功能的玩具示例,还是实际使用案例,该代码与以下代码具有不同的行为?

constexpr int AddEleven(int n) {
    return n + 11;
}

在这种情况下使用lambda表达式有什么好处?

解决方法

在这种情况下使用lambda表达式有什么好处?

没有好处。

它的作用非常简单明了,其目的是成为 valid 代码示例。几乎没有人需要一个程序将“ Hello World”输出到控制台,但是示例代码中有数百种用法。

,

立即调用的lambda可用于在表达式中提供语句友好的范围,通常以比构造函数参数允许的更复杂的方式初始化const变量:

auto const v = [&] {
    std::vector<int> v;

    // do some stuff
    for(/*...*/)
        v.push_back(/*...*/);

    return v;
}();

return语句必须已经出现在作用域中,因此将其与上述模式结合不会有太大的好处。但是,我可以想象它曾经用来澄清需要这种初始化的提前条件:

if(/* some corner case */)
    return [&] {
        std::vector<int> v;
    
        // do some stuff
        for(/*...*/)
            v.push_back(/*...*/);
    
        return v;
    }();

...相比:

if(/* some corner case */) {
    std::vector<int> v;
    
    // do some stuff
    for(/*...*/)
        v.push_back(/*...*/);
    
    return v;
}

... return远离条件的地方。

,
This code demonstrates a feature of c++ that a lamda can be made constexpr. Which is not possible before c++17.
This code will not work before c++17.

#include <iostream>

constexpr int Increment(int value) {
    return [value] { return value + 1; }();
};


int main()
{
    Increment(10);
    static_assert(11 == Increment(10),"Increment does not work correctly");

    return 0;

}