2016-08-17 5 views
-4

intと関数オブジェクトを呼び出し側に返さなければならないのですが、私はタプルを返すように考えましたmake_tuple(int,[](some){})私は今GCC上でdecltpe(auto)を返しますタイプは、私がやっている何THER iがstd::tuple<int,auto> myfun()として、今、私は以下のようにすること(ただし、わからない)してきた私の戻り値の型を作ることができるどのような方法であるstd :: tupleはautoを型として受け入れますか

auto myfun()->decltype(make_tuple(100,p)) 
{ 
    auto p=[](some){}; 
    return make_tuple(100,p); 
} 

は大丈夫でしょうか?

+3

これは、コンパイルしていますか?それはしないでください。 – NathanOliver

+0

ここで 'decltype(auto)'が必要なのはなぜですか?あなたのコンパイラが関数の戻り値型の減算をサポートしているならば、上記の例の後ろにある戻り値の型を取り除くことは有効です。 – Praetorian

+3

ここで簡単なテストケースを作成してコンパイルしてみるよりも、ここで質問するほうが簡単です。 – Praetorian

答えて

5

いいえ。pはそのスコープでは使用できません。ラムダ式は評価されていないコンテキスト(decltype)には表示されません。 (hereもっとを参照してください)

ただし、std::functionでそれをラップすることができます:

std::tuple<int, std::function<void(some)>> myfun() 
{ 
    std::function<void(some)> p = [](some){}; 
    return std::forward_as_tuple(100, p); 
} 
+2

'std :: funciton'は、本来必要なものがない場合に間接参照を追加します。私はこれが好きではない。 – SergeyA

+0

@ SergeyAあなたが知らない型を返すことはできません。私は関数の外に型を入れないとより良い方法を見ることができません。 – NathanOliver

+1

@SergeyAと同じ発言。変数がキャプチャされていない場合は、std :: functionの代わりに関数ポインタを使用します(型消去による間接指定なし)...または問題を回避し、関数の外側で 'p'を定義することをお勧めします。 – davidhigh

関連する問題