C++ 14多态lambda可能存在gcc错误?

Vit*_*meo 14 c++ lambda gcc clang c++14

我发现了使用多态C++ 14 lambdas(lambdas auto在其参数中)的奇怪行为:


小片0:

#include <iostream>

template<typename T> void doLambda(T&& mFn)
{
  std::forward<T>(mFn)(int{0});
}

template<typename T> void test(T&& mV)
{
    doLambda([&mV](auto mE)
    {
        std::forward<decltype(mV)>(mV);
    });
}

int main() { test(int{0}); return 0; }
Run Code Online (Sandbox Code Playgroud)

clang ++ 3.5.1:代码片段编译并成功运行.

g ++ 4.9.2:代码片段无法编译:

example.cpp:实例化'test(T&&)::<lambda(auto:1)> [with auto:1 = int; T = int]':

5:从'void doLambda(T&&) [with T = test(T&&) [with T = int]::]'
13要求:从'void test(T&&) [with T = int]'
18要求:从这里要求
12:错误:'mV'未在此范围内声明

std::forward<decltype(mV)>(mV);
^

编译失败


小片1:

与代码段0的唯一区别在于autolambda 的内部被替换为int.

#include <iostream>

template<typename T> void doLambda(T&& mFn)
{
  std::forward<T>(mFn)(int{0});
}

template<typename T> void test(T&& mV)
{
    doLambda([&mV](int mE)
    {
        std::forward<decltype(mV)>(mV);
    });
}

int main() { test(int{0}); return 0; }
Run Code Online (Sandbox Code Playgroud)

clang ++ 3.5.1:代码片段编译并成功运行.

g ++ 4.9.2:代码片段编译并成功运行.


代码段3:

lambda现在被称为就地.auto仍然使用.

#include <iostream>

template<typename T> void test(T&& mV)
{
    [&mV](auto mE)
    {
        std::forward<decltype(mV)>(mV);
    }(int{0});
}

int main() { test(int{0}); return 0; }
Run Code Online (Sandbox Code Playgroud)

clang ++ 3.5.1:代码片段编译并成功运行.

g ++ 4.9.2:代码片段编译并成功运行.


为什么g ++会抱怨代码片段0?我的代码有什么问题吗?这是一个已知的错误还是我应该提交?

Vit*_*meo 1

正如评论中所述,这种行为确实是一个 gcc bug