2017-01-31 16 views
18

tôi đi qua một lambda với một init-bắt loop truy cập như thế này:Tại sao tôi nhận được cảnh báo chụp lambda chưa sử dụng?

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

Đối với g ++ lên đến 7.0 SVN và kêu vang ++ lên đến 3.9.1, điều này tất cả các biên dịch cảnh báo miễn phí. Tuy nhiên, đối với vang ++ 5.0 SVN, tôi nhận được

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 { 

mặc dù nó vẫn còn in ra câu trả lời chính xác. Live Example

Câu hỏi: tại sao tôi nhận được cảnh báo mới này từ một lần nữa?

+0

Ồ, điều này có nghĩa vụ phải biên dịch không? 'i' không được định nghĩa ở bất cứ đâu trước khi chụp. Hấp dẫn. – DeiDei

+1

@DeiDei Có, điều này là nghĩa vụ phải cung cấp cho các đối tượng đóng cửa một biến thành viên 'i', khởi tạo để 2. – TemplateRex

+1

Bug chắc chắn. Edit: Wild đoán chắc chắn là sai. – AndyG

Trả lời

13

Mã của bạn hợp lệ.

Cảnh báo của Clang là vô nghĩa.

Báo cáo vấn đề này dưới dạng lỗi.

+0

cảm ơn, FTFY https://llvm.org/bugs/show_bug.cgi?id=31815 – TemplateRex

Các vấn đề liên quan