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

时间:2019-09-13 21:42:37

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

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;
}

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

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

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

1 个答案:

答案 0 :(得分:6)

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表达式中的默认参数有效。