【问题标题】:MSVC 19.22 emitts C4626 Warning on LambdaMSVC 19.22 在 Lambda 上发出 C4626 警告
【发布时间】:2019-09-26 13:10:53
【问题描述】:

警告 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 以获取警告。因为我们将每个警告都映射为错误,所以现在这是不可能的。

需要这种级别的冗长吗?还是可以说是bug?

【问题讨论】:

  • 对我来说似乎是一种回归。 C4626 documentation 明确讨论了基类和派生类,它们应该与 lambda 无关。也许 MSVC 现在将每个 lambda 派生自某个基作为实现细节(不知道为什么会有用),但从 C++ 标准的角度来看,这段代码中没有发生继承。

标签: c++ visual-studio-2019 c++20


【解决方案1】:

这是一个已向 MSVC 开发团队报告的已知错误; current status 是“已修复的待发布版本”(在 16.5 版中)。

与此同时,可以使用#pragma warning(suppress:4626) 指令which disables the warning 解决此问题,但仅适用于非常下一个 行代码:

suppress - 将 pragma 的当前状态推送到堆栈上,禁用 下一行的指定警告,然后弹出警告 堆栈以便重置 pragma 状态。

或者,使用 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 发布之前,它将作为临时权宜之计,然后,搜索和删除所有出现的宏将相当容易。

【讨论】:

  • 感谢您的友好回复和建议。实际上这个错误是我自己报告的,我期待 16.5。与此同时,我们按照您的建议禁用了警告。
猜你喜欢
  • 2021-07-17
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2012-07-27
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多