【问题标题】:Does C++14 and above allow default parameters for Lambda functions? If so how?C++14 及更高版本是否允许 Lambda 函数使用默认参数?如果有怎么办?
【发布时间】:2019-09-13 21:42:37
【问题描述】:

在 c++ 14 中 lambda 函数是否更改为接受默认参数?

此示例不适用于 C++ 11:

int main() {

    int i = 34;
    auto RectSurf = [i](int length = 0, int width = 0){ return length * width;};
    cout << RectSurf(10) << endl;


    std::cout << std::endl;
}

但它在 C++ 14 及更高版本上运行良好。那么它是否正确?因为 C++ prime 5ed 说:“将参数传递给 Lambda 与普通函数调用一样,对 lambda 的调用中的参数用于初始化 lambda 的参数。像往常一样,实参和参数类型必须匹配。与普通函数不同,lambda 可能没有默认参数(第 6.5.1 节,第 236 页)。因此,对 lambda 的调用始终具有与 lambda 具有参数一样多的参数。一旦参数被初始化,函数体就会执行。

作为一个接受参数的 lambda 示例,我们可以编写一个行为类似于我们的 isShorter 函数的 lambda:“来自 C++ Prime 5ed。

但在 C++14 及更高版本上的相同代码可以正常工作!但我也在 S.O 中读到 lambda 函数可以有一个默认参数,条件是 Lambda 的捕获列表中没有捕获任何变量。

【问题讨论】:

    标签: c++ c++11 lambda c++14 default-arguments


    【解决方案1】:

    Lambda 表达式中的默认参数已显式添加到 C++14 的标准中,并且在 C++11 中是不允许的。如果你 run the code against two different compiler flags in GCC,一个用于 C++11,一个用于 C++14,并使用 -Wpedantic 标志编译,你会看到这一点,你会看到当为 C++11 编译时,编译器发出一个警告(GCC 仍然支持它,但告诉你它不符合标准),而在 C++14 中,没有警告。

    所以是的。在 C++14 及更高版本中,Lambda 表达式中的默认参数有效。

    【讨论】:

    • 好的,谢谢。所以你的意思是他们是在没有任何条件的情况下添加的,我的意思是(就像我在我的主题中已经说过的:是否在捕获列表中捕获了一个对象)?
    • @ItachiUchiwa 我在标准中找不到任何语言规定捕获变量会影响是否允许它们具有默认参数。这可能是您的环境中特定于编译器的限制,或者是告诉您这件事的人的环境。
    猜你喜欢
    • 2012-12-20
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多