2016-06-15 11 views
6

今日(funcintのparamで宣言されましたが、int*std::threadコンストラクタの二番目のparamとして渡された):このC++型の解釈方法は?私は、次の不正なコードの断片を手伝った

#include <thread> 

void func(int); 
int* ptr; 

void start() 
{ 
    std::thread t = std::thread(func, ptr); 
} 

私はGCC 5.3.0でこれをコンパイルしようとすると、それは、次のタイプのエラーメッセージが印刷された:

class std::result_of<void (*(int*))(int)> 

今、私はclass std::result_of<>にパラメータとして渡されたタイプをどのように解釈するかを疑問に思います。これは関数へのポインタ(この場合はvoid(*)(int))と似ていますが、角括弧内に別の文字の後に(int*)が追加されています。どのようにこのタイプを解釈するのですか?

+0

'func'が' int'を必要とする場合、なぜあなたは 'int *'を渡していますか? – NathanOliver

+0

これは私が今日見たコードの誤りです - おそらくこれはタイプミスでした。 –

+2

同様の記述は[cdeclに従う](http://cdecl.ridiculousfish.com/?q=void+%28*f%28int*%29%29%28int%29)を与えます。 – ArchbishopOfBanterbury

答えて

5
void (*(int*))(int) 

です:

戻り

タイプintの単一のパラメータを取り、

voidを返す関数へのポインタとして型int*の単一のパラメータを取る関数


void (*signal(int sig, void (*func)(int)))(int); 

funcパラメータと同じタイプのものである)以前のシグナルハンドラへのポインタを返す:これは、C/C++標準ライブラリ関数signalと同様です。

EDIT:自体はまだ私が説明したタイプであるstd::result_ofで使用Pete Becker pointed out in comment、それmeans something differentが、式の型として、std::result_ofはちょうどそれを異なって解釈します。

+0

ありがとう、私は今それを参照してください。私は間違った点からデコードを開始し、混乱しました。 –

+1

はい、それは現実の世界にあるでしょう。しかし、**これは** std :: result_of'の引数型であることを意味するものではなく、呼び出し可能な型とその引数リストを表すためにこの表記をハイジャックします。 –

+0

@PeteBecker OPはその宣言について混乱していると思いました。私は 'std :: result_of'について聞いたことがありません(C++ 11が出てからC++を学んだので、' decltype'と新しい機能を使っています)。私は私の答えを編集します。 – PcAF

7

これは見た目ほど簡単ではありません。 std::result_ofは型システムを悪用して関数呼び出しに関する情報を密輸し、その関数呼び出しの戻り値の型がわかるようにします。 std::result_of

引数はFtyが呼び出し可能なタイプとT1等である形態Fty(T1, T2, ...)は、それはと呼ばれている引数の型であるています。その情報が与えられた場合、std::result_ofにはtypeという名前のネストされた型があります。これは、指定された型の引数を持つFtyの署名付き呼び出し可能型を呼び出す戻り型の同義語です。 Phew、それは一口です。

したがって、result_of<void (*(int*))(int)>には、テンプレート引数に2つの部分があります。最初の部分はvoid (*(int*))で、これは問題の呼び出し可能な型です。この場合、それはint*をとり、voidを返す関数へのポインタです。 2番目の部分は(int)であり、提案された引数のタイプリストです。

std::result_ofは、タイプがvoid (*(int*))で、引数リストが(int)でインスタンス化されています。あなたが指定したように、それは問題です。型int*の引数を取る関数に、タイプintの引数を渡すことはできません。

嬉しいですか? (ちなみに、これはもはや必要ではないかなり低レベルのテンプレートハッカーである; decltypeは、関数呼び出しの戻り値の型を理解するためのきれいな方法です)。

+0

はい、それは最初は混乱していました。説明をありがとう。 –

関連する問題