【发布时间】:2015-03-31 15:00:11
【问题描述】:
我发现使用多态 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:sn-p编译运行成功。
g++ 4.9.2:sn-p 编译失败:
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:
与 sn-p 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:sn-p编译运行成功。
g++ 4.9.2:sn-p编译运行成功。
片段 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:sn-p编译运行成功。
g++ 4.9.2:sn-p编译运行成功。
为什么 g++ 抱怨 sn-p 0? 我的代码有什么问题吗?这是一个已知的错误还是我应该提交这个?
【问题讨论】:
-
显然是一个错误。不会在 trunk 上重现,所以我猜它已经修复了。
-
@T.C.您能否发表您的评论作为答案,以便我接受?
-
似乎是这个错误 - gcc.gnu.org/bugzilla/show_bug.cgi?id=61814 Jonathan Wakely 最后评论中的示例现在在主干上编译。
标签: c++ gcc lambda clang c++14