当涉及到lamba函数的指针时,g ++ 4.5.3是否被破坏?

时间:2013-05-24 18:32:47

标签: 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()>]’

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

所以我的问题是,如果我做了一些无效的事情,或者这个版本是不是完全没有完成任务?

2 个答案:

答案 0 :(得分:2)

  

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

不,这不是转换为相同类型。尽管有相同的身体,但不同的羔羊有不同的类型。较新版本的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>')
  

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

确实如此(4.5.4,至少,我没有4.5.3进行测试),但你的初始化并不完全正确。

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

答案 1 :(得分:0)

我不确定4.5.3中n3043的状态,但你应该可以使用函数指针转换。如果我没有误解你的使用意图,这可能适合你;

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