gpt4 book ai didi

c++ - 实际使用捕获时未使用的 lambda 捕获警告

转载 作者:可可西里 更新时间:2023-11-01 18:36:33 25 4
gpt4 key购买 nike

这段代码:

void foo(int);
int main() {
const int i = 0;
auto l = [i](){foo(i);};
}

( godbolt )

clang编译时会报编译错误

-std=c++17 -Werror -Wunused-lambda-capture

错误信息是error: lambda capture 'i' is not required to be captured for this use

错误是正确的:i 可以在这里隐式捕获,不需要显式捕获。但是,a) 警告命名不当,因为使用了 i 但警告是针对 unused lambda 捕获的,b) 我只是不希望这是一个错误.我想为实际未使用的 lambda 捕获报错,但不要为使用过的显式捕获的变量报错,这些变量本可以被隐式捕获。

是否有执行此操作的 clang 设置?还是我必须使用 pragma diagnostic push/pop 来消除错误?

最佳答案

我认为你很不幸在这里运气不好。如果我们检查实现此功能的评论 [Sema] Add warning for unused lambda captures ,我们可以看到关于如何使警告静音的讨论被广泛讨论。包括使未使用的警告静音的规范 clang 方法,该方法被强制转换为 void:

I think that expected-warning shouldn't be used here as you have (void)fname in the lambda (I don't get this warning if I test this locally).

哪个有效 see it live但对这种情况感觉很傻。

使用 -Wno-unused-lambda-capture 但这对您来说不是一个有利的选择:

I think that the patch would be neater if you add "-Wno-unused-lambda-capture" to the options for all of the tests that are modified by this patch in the CXX/ directory. This would avoid redundant (void) uses and ensure that the (void) uses won't interfere with the original intent where things might be only used in the capture list.

从捕获中省略变量,因为它没有被 odr 使用,但正如所指出的那样,这会暴露实现差异,因为 MSVC 不进行此优化:

It will compile without any warnings if I remove kDelta from the list of captures:

#include <stdio.h>

int main(void) {
const int kDelta = 10000001;
auto g = [](int i)
{
printf("%d\n", i % kDelta);
};
g(2);
}

But then Microsoft C++ compiler will raise the error:

error C3493: 'kDelta' cannot be implicitly captured because no default capture mode has been specified

我们可以看到这个案例live as well并且确实从捕获中删除 i 确实修复了 clang 和 gcc 但不是 MSVC。

适用于所有实现的另一种解决方案是显式捕获 [i=i],但听起来这也不是理想的解决方案 (see it live)。

要是能申请就好了[[maybe_unused]]在这里,但我们不能。

关于c++ - 实际使用捕获时未使用的 lambda 捕获警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52416362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com