Tôi đang đối phó với một số mã C mà mất một số dữ liệu, và chuyển đến chức năng thông qua tại:Các tham số lambda của tôi có thực sự che giấu người dân địa phương của tôi không?
void foo(int* data, void (*fun)(int*)){
(*fun)(data);
};
Các tác phẩm sau đây mà không cảnh báo:
void bar(int* data){};
int main(){
int data=0;
foo(&data,bar);
}
Tuy nhiên, nếu tôi sử dụng một lambda thay vì:
int main(){
int data=0;
foo(&data,[](auto data){});
}
tôi nhận được cảnh báo sau đây:
warning: declaration of ‘data’ shadows a previous local [-Wshadow]
foo(&data,[](auto data){});
^
o.cpp:14:7: note: shadowed declaration is here
int data=0;
Nhưng tôi nghĩ một nhóm chụp rỗng sẽ loại trừ instantiation đầu tiên trong hình dáng của nó lên.
là cảnh báo này hợp pháp?
Tại sao không phải là chụp trống đủ để tránh cảnh báo?
Tôi nghĩ cảnh báo chỉ ở đó để cảnh báo bạn rằng bạn có thể nghĩ mình đang sử dụng 'dữ liệu' chứ không phải' dữ liệu'. Nó không biết ý định * của bạn là gì. – vu1p3n0x
_name_ thực sự bị che khuất. Bạn không cần chụp một biểu tượng để sử dụng tên của nó, ví dụ: trong một ngữ cảnh không được đánh giá như 'decltype'. – ildjarn
Ít nhất trong Visual Studio 2015, bạn * không thể * sử dụng các ký hiệu trong một ngữ cảnh không được đánh giá (thậm chí decltype (dữ liệu) hoặc sizeof (dữ liệu) không thành công với một lỗi 'C2065: 'data' undeclared identifier') –