C++ 带有通用lambda g+的阴影警告+;
g++(4.9)为以下代码提供阴影警告:C++ 带有通用lambda g+的阴影警告+;,c++,lambda,warnings,C++,Lambda,Warnings,g++(4.9)为以下代码提供阴影警告: class Invoke { public: template <typename F> void invoke (F&& f) { void *p; f(p); } }; int main () { Invoke in; auto fn = [](auto *p) { }; in.invoke(fn); } 类调
class Invoke {
public:
template <typename F>
void invoke (F&& f)
{
void *p;
f(p);
}
};
int main ()
{
Invoke in;
auto fn = [](auto *p)
{
};
in.invoke(fn);
}
类调用{
公众:
模板
无效调用(F&&F)
{
void*p;
f(p);
}
};
int main()
{
援引;
自动fn=[](自动*p)
{
};
in.调用(fn);
}
如果编译此文件,将在启用-Wshadow的情况下收到以下警告:
invoke.cpp: In instantiation of ‘main()::<lambda(auto:1*)> [with auto:1 = void]’:
invoke.cpp:10:12: required from ‘void Invoke::invoke(F&&) [with F = main()::<lambda(auto:1*)>&]’
invoke.cpp:22:17: required from here
invoke.cpp:18:25: warning: declaration of ‘p’ shadows a previous local [-Wshadow]
auto fn = [](auto *p)
^
invoke.cpp:8:15: note: shadowed declaration is here
void *p;
^
invoke.cpp:In'main()::[with auto:1=void]的实例化中:
invoke.cpp:10:12:在“void invoke::invoke(F&)[with F=main()::&]中是必需的”
invoke.cpp:22:17:从这里开始需要
invoke.cpp:18:25:警告:“p”的声明会影响到以前的本地[-Wshadow]
自动fn=[](自动*p)
^
invoke.cpp:8:15:注意:这里有阴影声明
void*p;
^
现在从我的角度来看,这两种情况下的变量“p”处于不同的上下文中,因此它不应该给出警告。如果我用“void*”代替“auto*”,则没有警告。这是预期的吗?从GCC 6.x开始,该警告不再显示,因此我怀疑这可能是旧版本GCC中的编译器错误。嗯,看起来是这样的。真烦人。谢谢