Возможная ошибка gcc с полиморфными лямбдами С++ 14?

Я нашел странное поведение, используя полиморфные С++ 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; }

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 заключается в том, что 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:

Теперь лямбда называется на месте. 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? Что-то не так в моем коде? Является ли это известной ошибкой или я должен ее отправить?

Ответы