MSVC 19.22 在 Lambda 上发出 C4626 警告
MSVC 19.22 emitts C4626 Warning on Lambda
警告 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 发布,然后,搜索和删除宏的所有出现将相当容易。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- MSVC 19.22 在 Lambda 上发出 C4626 警告
- Visual C++中的 C4510-C4513 和 C4623-C4626 警告范围有什么区别?