【发布时间】:2016-05-24 03:39:59
【问题描述】:
我正在处理一些 C 代码,它获取一些数据,并将其转发给传入的函数:
void foo(int* data, void (*fun)(int*)){
(*fun)(data);
};
以下工作没有警告:
void bar(int* data){};
int main(){
int data=0;
foo(&data,bar);
}
但是,如果我改用 lambda:
int main(){
int data=0;
foo(&data,[](auto data){});
}
我收到以下警告:
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;
但我认为空捕获组会在查找过程中排除第一个实例化。
这个警告合法吗?
为什么空捕获不足以避免警告?
【问题讨论】:
-
我认为该警告只是为了警告您,您可能认为您使用的是
data而不是data。它不知道你的 intent 是什么。 -
name 确实被遮住了。您无需捕获符号即可使用其名称,例如在未经评估的上下文中,例如
decltype。 -
至少在 Visual Studio 2015 中,您不能在未评估的上下文中使用符号(即使 decltype(data) 或 sizeof(data) 因
error C2065: 'data' undeclared identifier而失败) -
@AndreasH。请参阅 [expr.prim]/7 ,“[...] 出于名称查找的目的,[...] compound-statement 在 lambda-expression 的上下文中被考虑”。看起来您的编译器在名称查找时失败了,这与是否发生捕获是分开的。
标签: c++ gcc lambda clang compiler-warnings