2017-01-31 14 views
18

Я пропускание лямбды с инициализацией захваченного счетчиком цикла, как это:Почему я получаю предупреждение о неиспользованном лямбда-захвате?

#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?

+0

О, вау, это должно скомпилировать? 'i' не определялось где-либо до захвата. Интересно. – DeiDei

+1

@DeiDei Да, это должно дать объекту замыкания переменную-член 'i', инициализированную до 2. – TemplateRex

+1

Ошибка точно. Редактировать: Дикая догадка, конечно, была неправильной. – AndyG

ответ

13

Ваш код действителен.

Предупреждение Клана - это нонсенс.

Сообщите об этом как об ошибке.

+0

спасибо, FTFY https://llvm.org/bugs/show_bug.cgi?id=31815 – TemplateRex

 Смежные вопросы

  • Нет связанных вопросов^_^