は、私はこのような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から取得していますか?
ああ、これはコンパイルするはずですか? 'i'はキャプチャ前のどこにも定義されていませんでした。面白い。 – DeiDei
@DeiDeiはい、閉包オブジェクトにメンバ変数 'i'を与え、2に初期化することになっています。 – TemplateRex
確実にバグがあります。編集:野生の推測は確かに間違っていた。 – AndyG