2017-01-31 25 views
18

我传递一个lambda像这样一个init捕获循环计数器:为什么我得到一个未使用的lambda捕获警告?

#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

哦哇,这是应该编译?在捕获前没有定义“我”。有趣。 – DeiDei

+1

@DeiDei是的,这应该给闭合对象一个成员变量'i',初始化为2. – TemplateRex

+1

错误肯定。编辑:疯狂的猜测肯定是错误的。 – AndyG

回答

13

您的代码有效。

铿锵的警告是无稽之谈。

举报此错误。

+0

谢谢,FTFY https://llvm.org/bugs/show_bug.cgi?id=31815 – TemplateRex

相关问题