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。
我发现使用多态 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。