可能的 gcc 错误与 C++14 多态 lambda
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:代码段编译失败:
示例.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?我的代码有什么问题吗?这是一个已知的错误还是我应该提交这个?
如评论中所述,这种行为确实是一个 gcc 错误。
相关文章:
- 多态性和功能结合
- 具有默认模板参数的多态类的模板推导失败
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 多态二进制函数
- 访问存储在向量C++中的结构的多态成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 将 std::allocate_shared 与多态资源分配器一起使用
- 通过switch和static_cast访问多态对象的运行时类型
- C++boost序列化多态性问题
- 多态杆件变量 - 类设计
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- Doees the 'this' 指针参与虚函数的多态行为
- C++ 在堆栈中包含多态属性的类对象存储
- 基类和派生类的多态赋值运算符
- 转身多态对象
- 如何在基类指针向量的元素上应用重载的多态函数
- 具有智能指针的多态性
- 可能的 gcc 错误与 C++14 多态 lambda
- 是否可以找出多态C++ 14 lambda 的参数类型和返回类型