我理解函數類型的問題(例如它們顯示爲std::function
的Signature
模板參數):C++函數類型
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的,我還可以用它來建立其他類型的,但顯然沒有別的:
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"
已經打到我這裏什麼語言的偏僻的角落?這種奇怪的類型是如何調用的,我可以在模板參數之外使用它嗎?
標準簡單地允許你*通過一個typedef到他們的簽名(實際上,功能型)聲明*函數。 – Xeo