3

ラムダ関数を試し、それらを実行するためのジャンプ テーブルを作成していましたが、g++ がラムダ関数の型を認識せず、配列またはタプル コンテナーに割り当てることができませんでした。

そのような試みの1つはこれでした:

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 に変換できませんか? どう言う意味ですか?oO

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

明示的にマークされたコンストラクター? なんで?

だから私の質問は、私が何か無効なことをしているのか、それともこのバージョンがタスクに完全に対応していないのかということです.

4

2 に答える 2

0

4.5.3 でのn3043の状態はわかりませんが、関数ポインタ変換を使用できるはずです。私があなたの使用意図を誤解していなければ、これでうまくいくかもしれません。

void (*x)();
decltype(x) fn = [](){};
decltype(x) jmpTable[] = { [](){}, [](){} };
于 2013-05-24T18:52:13.043 に答える