c++ - 使用 -Wall 和 -Wextra 时未使用的 lambda 不会发出警告

标签 c++ lambda g++ clang++ static-code-analysis

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

auto foo = [](){};

会生成警告:未使用的变量'foo'或类似内容。

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

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

那么,如果没有为函数对象创建我自己的 [[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 警告都不适合此程序。

关于c++ - 使用 -Wall 和 -Wextra 时未使用的 lambda 不会发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64741559/

相关文章:

C++ 可变说明符

c++ - std::transform 与 std::for_each 不同吗?

c++ - 从管道读取随机失败

lambda - 如何在 emacs lisp 语言中正确使用 lambda?

c++ - 优化 c++/gcc 中的模板编译时间

c++ - 功能说明

c++ - 在 boost::mpl::for_each() 中调用通用 lambda

c++ - 自动参数捕获的推导规则是什么?

c++ - "munmap_chunk(): invalid pointer"带有 vector 算法

c++ - 解析编译错误 : no matching function for call to 'std::pair<,>::pair()'