Ответ 1
Как указано в комментариях, это поведение действительно является ошибкой gcc.
Я нашел странное поведение, используя полиморфные С++ 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? Что-то не так в моем коде? Является ли это известной ошибкой или я должен ее отправить?
Как указано в комментариях, это поведение действительно является ошибкой gcc.