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

Possible gcc bug with C++14 polymorphic lambdas?

我发现使用多态 C++14 lambda(参数中带有 auto 的 lambda)的奇怪行为:


片段 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; }

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

g++ 4.9.2:代码片段编译失败:

example.cpp: In instantiation of 'test(T&&)::<lambda(auto:1)> [with auto:1 = int; T = int]':

5 : required from 'void doLambda(T&&) [with T = test(T&&) [with T = int]::]'
13 : required from 'void test(T&&) [with T = int]'
18 : required from here
12 : error: 'mV' was not declared in this scope

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

Compilation failed


代码段 1:

与片段 0 的唯一区别是 lambda 中的 auto 被替换为 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; }

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; }

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

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


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

如评论中所述,此行为 is indeed a gcc bug