【发布时间】:2018-09-20 01:44:45
【问题描述】:
这段代码:
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 来消除错误?
【问题讨论】:
-
捕获 is 未使用,因为 lambda 中使用的
i实际上是封闭范围内的i,而不是隐式成员i在 lambda 本身中,因为i没有被 odr 使用。 -
没有默认捕获。 lambda 不会隐式捕获任何内容。