警告 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 发布,然后,搜索和删除宏的所有出现将相当容易。