g++ - 当涉及到 lambda 函数的指针时,g++ 4.5.3 是否损坏?

标签 g++ lambda

我正在尝试 lambda 函数并制作一个跳转表来执行它们,但我发现 g++ 无法识别 lambda 函数的类型,因此我可以将它们分配给数组或元组容器。

这样的尝试是这样的:

auto x = [](){};
decltype(x) fn = [](){};
decltype(x) jmpTable[] = { [](){}, [](){} };

在编译时我得到这些错误:

tst.cpp:53:27: error: conversion from ‘main()::<lambda()>’ to non-scalar type ‘main()::<lambda()>’ requested
tst.cpp:54:39: error: conversion from ‘main()::<lambda()>’ to non-scalar type ‘main()::<lambda()>’ requested

嗯嗯,不能从类型 A 转换为非标量类型 A?那是什么意思? o.O

我可以使用 std::function 让它工作,但问题是它似乎不适用于元组:

function<void()> jmpTable[] = [](){}; // works
struct { int i; function<void()>> fn; } myTuple = {1, [](){}}; // works
tuple<int, function<void()>> stdTuple1 = {1, [](){}}; // fails
tuple<int, function<void()>> stdTuple2 = make_tuple(1, [](){}); // works

tst.cpp:43:58: error: converting to ‘std::tuple<int, std::function<void()> >’ from initializer list would use explicit constructor ‘std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&) [with _U1 = int, _U2 = main()::<lambda()>, _T1 = int, _T2 = std::function<void()>]’

构造函数标记为显式?为什么?

所以我的问题是,如果我在做一些无效的事情,或者这个版本是否不能胜任这项任务?

最佳答案

Hmmmm, can't convert from type A to non-scalar type A? What's that mean? o.O

不,那不是同一类型的转换。尽管具有相同的主体,但不同的 lambda 具有不同的类型。较新版本的 GCC 使这一点更清楚,并给出错误消息:

error: conversion from '__lambda1' to non-scalar type '__lambda0' requested

clang 做得更好:

error: no viable conversion from '<lambda at test.cc:2:18>' to 'decltype(x)' (aka '<lambda at test.cc:1:10>')

I can use std::function to get this to work, but a problem with that is it doesn't seem to work with tuple:

确实如此(至少对于 4.5.4,我没有要测试的 4.5.3),但您的初始化不太正确。

tuple<int, function<void()>> stdTuple1 {1, [](){}}; // lose the = to initialise stdTuple1 directly

关于g++ - 当涉及到 lambda 函数的指针时,g++ 4.5.3 是否损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16741486/

相关文章:

c++ - clear() 是做什么的?

c# - 使用泛型指定 lambda 表达式但具有模板化类型

c++ - 异常处理器

c++ - 使用 g++ 从 cpp 文件和静态库创建共享库

c++ - 奇怪的是重复出现的模板模式。没有匹配的函数用于调用..模板参数/替换失败

c++ - std::function 作为自定义流操纵器

linq - 将 lambda 表达式转换为表达式树

c# - 如何在运行时创建一个表达式以在 GroupBy() 中使用 Entity Framework?

java - 如何使用 Java 的 lambda 表达式来打印数组?

具有范围解析和条件的 C++ 三元运算符