ラムダ関数を試し、それらを実行するためのジャンプ テーブルを作成していましたが、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()>]’
明示的にマークされたコンストラクター? なんで?
だから私の質問は、私が何か無効なことをしているのか、それともこのバージョンがタスクに完全に対応していないのかということです.