C ++ 14和更高版本是否允许Lambda函数使用默认参数?如果可以,怎么办?

Ita*_*iwa 2 c++ lambda default-arguments c++11 c++14

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

此示例不适用于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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是在C ++ 14及更高版本上使用相同的代码就可以了!但我也在SO中读到过,如果Lambda的捕获列表中没有捕获任何变量,则lambda函数可以具有默认参数。

Xir*_*ema 6

Lambda表达式中的默认参数已通过C ++ 14明确添加到标准中,而在C ++ 11中则不允许。如果您在GCC中针对两个不同的编译器标记运行代码,就可以看到此代码,一个标记用于C ++ 11,一个-Wpedantic标记用于C ++ 14,然后使用该标记进行编译,您会看到,为C ++ 11编译时,编译器会发出警告(GCC仍然支持它,但会告诉您它不符合标准),而在C ++ 14中则没有警告。

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

  • @ItachiUchiwa我无法在标准中找到任何语言来规定捕获变量曾经影响过是否允许使用默认参数。可能是您的环境或任何人告诉您的事情的环境中特定于编译器的限制。 (3认同)