C++ 带有通用lambda g+的阴影警告+;

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); } 类调

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);
}
类调用{
公众:
模板
无效调用(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中的编译器错误。嗯,看起来是这样的。真烦人。谢谢