2017-01-31 4 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 경고 메시지가 나옵니까?

+0

오 와우,이 컴파일해야합니까? 'i'는 캡처 이전에 정의되지 않았습니다. 흥미 롭 군. – DeiDei

+1

@DeiDei 그렇습니다. 이것은 클로저 객체에게 2로 초기화 된 멤버 변수'i'를 제공해야합니다. – TemplateRex

+1

확실한 버그. 편집 : 야생 추측은 확실히 틀렸어. – AndyG

답변

13

코드가 유효합니다.

Clang의 경고는 의미가 없습니다.

버그를 신고 해주세요.

+0

감사합니다. FTFY https://llvm.org/bugs/show_bug.cgi?id=31815 – TemplateRex