関数の型を理解するのに問題があります (たとえば、Signature
a のテンプレート パラメーターとして表示されますstd::function
)。
typedef int Signature(int); // the signature in question
typedef std::function<int(int)> std_fun_1;
typedef std::function<Signature> std_fun_2;
static_assert(std::is_same<std_fun_1, std_fun_2>::value,
"They are the same, cool.");
int square(int x) { return x*x; }
Signature* pf = square; // pf is a function pointer, easy
Signature f; // but what the hell is this?
f(42); // this compiles but doesn't link
変数f
を割り当てることはできませんが、呼び出すことはできます。変。では、何の役に立つのでしょうか?
ここで、typedef を const 修飾しても、それを使用してさらに型を構築できますが、明らかにそれ以外の目的はありません。
typedef int ConstSig(int) const;
typedef std::function<int(int) const> std_fun_3;
typedef std::function<ConstSig> std_fun_4;
static_assert(std::is_same<std_fun_3, std_fun_4>::value,
"Also the same, ok.");
ConstSig* pfc = square; // "Pointer to function type cannot have const qualifier"
ConstSig fc; // "Non-member function cannot have const qualifier"
ここで私は言語のどの隅にぶつかったのでしょうか? この奇妙な型はどのように呼び出され、テンプレート パラメーター以外で何に使用できますか?