2017-01-31 14 views
18

は、私はこのようなINIT-捕獲ループカウンタでラムダを渡しています:未使用のラムダキャプチャに関する警告が表示されるのはなぜですか?

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

++グラムについて++ 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

関連する問題