使用-Wall和-Wextra对未使用的lambda没有警告

问题描述

通常,如果您有lambda并忘记使用它,则会像其他任何未使用的变量一样收到警告(如果启用)。

@H_404_3@auto foo = [](){};

生成@H_404_3@warning: unused variable 'foo'或类似的内容

但是,如果lambda捕获有副作用(例如增加@H_404_3@shared_ptr的引用计数),则不会收到警告。

@H_404_3@auto x = std::make_shared<int>(23);
auto foo = [x](){ bar(*x); };

因此,除了为功能对象创建自己的@H_404_3@[[nodiscard]]包装外,我是否缺少其他警告标志或使用静态分析工具来发现此错误

主要是gcc用户,尽管在同一代码库中也会使用clang进行构建。

解决方法

程序中实际上没有什么要警告的。至少,可能产生的任何警告都不会属于-Wunused类别。这组警告是针对程序中的声明的,这些声明对程序的行为没有影响,提示程序员错误。对于未使用的声明,通常是这种情况,因为声明本身通常不会产生任何可观察到的副作用。

但是在您的代码中,foo 确实的声明具有明显的副作用:

auto x = std::make_shared<int>(23);
std::cout << x.use_count();         // prints 1
auto foo = [x](){ bar(*x); };
std::cout << x.use_count()          // prints 2

这里是demo

因此,我认为任何-Wunused警告都不适合该程序。