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?
Ồ, đ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
@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
Bug chắc chắn. Edit: Wild đoán chắc chắn là sai. – AndyG