/Zc:lambda(启用更新的 lambda 处理器)

/Zc:lambda 编译器选项支持符合的 lambda 语法和处理支持。

语法

/Zc: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 中设置此编译器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“C/C++”>“命令行”属性页

  3. /Zc:lambda/Zc:lambda- 添加到“附加选项:”窗格中。

另请参阅

/Zc(一致性)
/std(指定语言标准版本)