Почему я получаю предупреждение о неиспользованном лямбда-захвате?

19

Я прохожу лямбда с помощью счетчика цикла с init-capture следующим образом:

#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 и для clang ++ до 3.9.1 это все компилируется без предупреждения. Однако для clang ++ 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

Вопрос : почему я получаю это новое предупреждение Wunused-lambda-capture от clang?     

задан TemplateRex 31.01.2017 в 15:42
источник
  • О, вау, это должно скомпилировать? я не определялся нигде до захвата. Интересно. –  DeiDei 31.01.2017 в 15:49
  • @DeiDei Да, это должно дать объекту замыкания переменную-член i, инициализированную до 2. –  TemplateRex 31.01.2017 в 15:50
  • Ошибка точно. Редактировать: Дикая догадка, конечно, была неправильной. –  AndyG 31.01.2017 в 15:51

1 ответ

15

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

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

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

    
ответ дан Yakk - Adam Nevraumont 31.01.2017 в 15:58
  • спасибо, FTFY llvm.org/bugs/show_bug.cgi?id=31815 –  TemplateRex 31.01.2017 в 15:59