/Zc:lambda
(启用更新的 lambda 处理器)
/Zc:lambda
编译器选项支持符合的 lambda 语法和处理支持。
语法
]$
备注
/Zc:lambda
编译器选项支持符合的 lambda 处理器。 它根据 C++ 标准分析和实现 lambda 代码。 此选项默认处于关闭状态,因此将使用旧版 lambda 处理器。 使用此选项可以在使用默认 /std:c++14
或 /std:c++17
编译器选项时启用泛型 lambda 的一致性模式语法检查。
/Zc:lambda
由 /std:c++20
、[[/std:c++latest
] (std-specify-language-standard-version.md)、/permissive-
和 /experimental:module
选项自动启用。 可以使用 /Zc:lambda-
显式禁用。
从 Visual Studio 2019 版本 16.8 开始,/Zc:lambda
选项可用。 从 Visual Studio 2019 版本 16.3 开始,它以 /experimental:newLambdaProcessor
的形式提供,但现在已弃用此拼写。
旧版 lambda 处理器在解析和编译 lambda 时存在一些限制。 例如,这段符合代码的代码在 /Zc:lambda
下编译正确,但在 /Zc:lambda-
下报错:
void f1()
{
constexpr auto c_value = 1;
auto func = []()
{
return c_value; // error C3493: 'c_value' cannot be implicitly captured
// because no default capture mode has been specified
};
func(); // error C2064: term does not evaluate to a function taking 0 arguments
}
旧版 lambda 处理器编译此代码时不会出现警告,但新的 lambda 处理器会生成错误 C2760:
void f2() {
auto a = [](auto arg) {
decltype(arg)::Type t; // C2760 syntax error: unexpected token 'identifier', expected ';'
};
}
此示例显示正确的语法,现在由编译器根据 /Zc:lambda
强制执行:
void f3() {
auto a = [](auto arg) {
typename decltype(arg)::Type t;
};
}
在 Visual Studio 中设置此编译器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“C/C++”>“命令行”属性页。
将
/Zc:lambda
或/Zc:lambda-
添加到“附加选项:”窗格中。