通常,如果您有 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/