我正在尝试 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/