MSVC 19.22 在 Lambda 上发出 C4626 警告

MSVC 19.22 emitts C4626 Warning on Lambda

本文关键字:C4626 警告 Lambda MSVC      更新时间:2023-10-16

警告 C4626 阻止我们从 std:c++17 迁移到 std:c++latest。它从 19.22 开始(不是在 19.21 或更早(开始在几乎每个 lambda 上发出。

#pragma warning(default : 4626)
int main()
{
int foo;
auto bar = [&]() {
foo;
};
return 0;
}

<source>(8): warning C4626: 'main::<lambda_1>': assignment operator was implicitly defined as deleted

使用/std:c++latest/W4 编译

在我看来,这个警告根本没有错,而是冗长的方式。我们希望保持启用 C4626,以便在从显式/隐式删除的赋值运算符派生时收到警告。因为我们将每个警告都映射为错误,所以现在这是不可能的。

需要这种程度的冗长吗?或者它可以被描述为一个错误吗?

这是一个已知错误,已报告给 MSVC 开发团队;当前状态为"已修复待发布"(在版本 16.5 中(。

同时,可以使用#pragma warning(suppress:4626)指令解决此问题,该指令禁用警告,但仅适用于下一行代码:

抑制- 在堆栈上推送杂注的当前状态,禁用 下一行的指定警告,然后弹出警告 堆栈,以便重置杂注状态。

或者,使用 MSVC__pragma()语法,可以有条件地定义一个ENDLAMBDA(或任何你想称呼它(宏,如下所示(你只需要一次,在你的顶级".pch-forming"标头中(:

#if (__cplusplus > 201703L) // Using the "/std:c++latest" option...
#define ENDLAMBDA __pragma(warning(suppress:4626))
#else                       // Don't need it for earlier standards:
#define ENDLAMBDA
#endif

然后,在任何 lambda 表达式中,只需在结束}之前添加此宏;因此,在您的示例中,您可以拥有以下内容:

int main()
{
int foo;
auto bar = [&]() {
foo;
ENDLAMBDA };
return 0;
}

我承认有点笨拙 - 但它将作为临时的权宜之计,直到 16.5 发布,然后,搜索和删除宏的所有出现将相当容易。