C++14 及更高版本是否允许 Lambda 函数的默认参数?如果是这样怎么办?
Does C++14 and above allow default parameters for Lambda functions? If so how?
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++ prime 5ed 说:“将参数传递给 Lambda
与普通函数调用一样,lambda 调用中的参数用于初始化 lambda 的参数。像往常一样,参数和参数类型必须匹配。与普通函数不同,lambda 可能没有默认参数(第 6.5.1 节,第 236 页)。因此,对 lambda 的调用始终具有与 lambda 具有的参数一样多的参数。一旦参数被初始化,函数体就会执行。
作为带参数的 lambda 的示例,我们可以编写一个行为类似于 isShorter 函数的 lambda:" 来自 C++ Prime 5ed。
但相同的代码在 C++14 及更高版本上运行良好!但我也在 S.O 中读到,lambda 函数可以有一个默认参数,条件是 Lambda 的捕获列表中没有捕获任何变量。
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 表达式中的默认参数是有效的。
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++ prime 5ed 说:“将参数传递给 Lambda 与普通函数调用一样,lambda 调用中的参数用于初始化 lambda 的参数。像往常一样,参数和参数类型必须匹配。与普通函数不同,lambda 可能没有默认参数(第 6.5.1 节,第 236 页)。因此,对 lambda 的调用始终具有与 lambda 具有的参数一样多的参数。一旦参数被初始化,函数体就会执行。
作为带参数的 lambda 的示例,我们可以编写一个行为类似于 isShorter 函数的 lambda:" 来自 C++ Prime 5ed。
但相同的代码在 C++14 及更高版本上运行良好!但我也在 S.O 中读到,lambda 函数可以有一个默认参数,条件是 Lambda 的捕获列表中没有捕获任何变量。
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 表达式中的默认参数是有效的。