Я пропускание лямбды с инициализацией захваченного счетчиком цикла, как это:Почему я получаю предупреждение о неиспользованном лямбда-захвате?
#include <iostream>
auto sq(int c, int x) { return c * x * x; }
struct S {
template<class Fun>
void for_each(Fun fun) const {
for (auto i = 1; i < 4; ++i) {
fun(i);
}
}
};
int main()
{
S s;
auto sum = 0;
s.for_each([&, i = 2](auto c) mutable {
sum += sq(c, i++);
});
std::cout << sum; // 70 = 1 * 4 + 2 * 9 + 3 * 16
}
Для G ++ до 7.0 SVN и звон ++ до 3.9.1, все это компилирует предупреждение бесплатно. Однако для лязга ++ 5.0 SVN, я получаю
prog.cc:18:20: warning: lambda capture 'i' is not required to be captured for this use [-Wunused-lambda-capture] s.for_each([&, i = 2](auto c) mutable {
несмотря на то, что до сих пор печатает правильный ответ. Live Example
Вопрос: почему я получаю этот новый Wunused-lambda-capture
предупреждение от clang?
О, вау, это должно скомпилировать? 'i' не определялось где-либо до захвата. Интересно. – DeiDei
@DeiDei Да, это должно дать объекту замыкания переменную-член 'i', инициализированную до 2. – TemplateRex
Ошибка точно. Редактировать: Дикая догадка, конечно, была неправильной. – AndyG