2017-01-31 33 views
18

Böyle bir init-yakalanan döngü sayacı ile bir lambda geçirerek:Neden kullanılmamış bir lambda yakalama uyarısı alıyorum?

#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 için ++ 7.0 SVN kadar ve clang 3.9.1 kadar bu her uyarı içermeyen derler. Ancak, clang ++ 5.0 SVN, ben hala doğru cevabı yazdırır rağmen

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 { 

olsun. Live Example

Soru: Neden bu yeni Wunused-lambda-capture uyarısını clang'den alıyorum?

+0

Oh wow, bunun derlenmesi gerekiyor mu? Çekimden önce herhangi bir yerde tanımlanmadım. İlginç. – DeiDei

+1

@DeiDei Evet, bu kapanış nesnesine bir üye değişkeni vermem gerekiyordu, ilk başta 2'ye sıfırlanmıştı – TemplateRex

+1

Hata. Düzenleme: Vahşi tahmin kesinlikle yanlıştı. – AndyG

cevap

13

Kodunuz geçerlidir.

Clang'ın uyarısı saçmalıktır.

Bunu bir hata olarak bildirin.

+0

teşekkürler, FTFY https://llvm.org/bugs/show_bug.cgi?id=31815 – TemplateRex

İlgili konular