我发现使用多态C ++ 14 lambda(在参数中带有auto
的lambdas)的奇怪行为:
代码段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的唯一区别在于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?我的代码有什么问题吗?这是一个已知的错误还是我应该提交?