- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这段代码:
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/
在我们的数据库表上,我们使用两个唯一的非聚集索引来创建跨四个字段的唯一约束。我们使用两个,因为其中一个字段 ZipCode 是一个可为空的字段。如果表中存在一条包含 ZipCode 的 null 条目
我刚刚开始学习 Rails 3 教程,以便对框架有一点熟悉,但我在生成 schema.rb 时遇到了问题。我的操作系统是 Windows 7 x64、Ruby 1.9.2、MySQL2 gem 0.2
我是一名优秀的程序员,十分优秀!