return 在函数的 lambda 表达式的 return 值中有什么意义?

What is the significance of returning the return value of a lambda expression from a function?

自 C++17 起 it is possibleconstexpr 函数中使用 lambda 表达式。

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

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

这只是一个演示语言功能的玩具示例,还是在实际用例中此代码的行为与以下代码不同?

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

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

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;

}

What would be the benefit of using a lambda expression in this case?

没有任何好处。

它的作用简单明了,目的是作为有效代码的示例。以几乎相同的方式 no-one 需要一个将“Hello World”输出到控制台的程序,但在示例代码中有数百种用途。

Immediately-invoked lambda 可用于在表达式中提供 statement-friendly 范围,通常以比构造函数参数允许的更复杂的方式初始化 const 变量:

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

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

    return v;
}();

A return 语句必须已经出现在一个范围内,因此将它与上述模式结合起来并没有太大的好处。但是我可以想象它曾经用来阐明需要这样的初始化的 early-out 条件:

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 离条件更远。