2015-12-23 151 views
12

之間的區別我知道void (*)(int)是函數指針,但是什麼是void(int)void(int)&void(*)(int)

它用於std::function模板。

說我有一個功能void fun(int){}decltype(&fun)給出void(*)(int)decltype(fun)給出void(int)

+3

[回調函數:void之間的'差(* FUNC)(INT)'和'無效(FUNC)(INT)']( http://stackoverflow.com/q/25953542/995714) –

+0

@LưuVĩnhPhúc如果您認爲這是重複的,您應該將其標記爲 – acupajoe

+1

它不是重複的。這個問題是關於一個函數類型聲明的函數參數。 – interjay

回答

14

如果T是一種類型的,那麼T*表示類型 「指針-TO-T」。

類型void(int)功能型,它是採取一個int並返回void函數的類型。例如,它是f類型如果f被聲明爲void f(int);

如果T = void(int),然後T*拼寫void(*)(int),所以後者是函數指針的類型。你也可以形成一個函數的參考,它是T& = void(&)(int);這有時會更有用(例如,您可以將函數左值的地址)。


除了注意:功能很容易左值衰減自己的函數指針。您可以通過函數左值或通過函數指針調用函數。當作爲間接尋址運算符(*)的操作使用,函數值衰減,這樣你就可以提領連連指針:

printf("Hello world\n");  // OK 
(*printf)("Hello world\n");  // also OK 
(****printf)("Hello world\n"); // four-star programmer 

有的只是時間的一個函數不衰的使用時,地址的操作者的操作數,或當結合於一個參考:

void f(int);   // our example function 

void(*p1)(int) = &f; // no decay of "f" here 
void(*p2)(int) = f; // "f" decays 
void(&r1)(int) = f; // no decay of "f" here 

void g(void(&callback)(int), int n) { 
    callback(n); 
} 
g(f, 10);    // no decay of "f" here 

template <typename F, typename ...Args> 
decltype(auto) h(F&& callback, Args&&... args) { 
    return std::forward<F>(callback)(std::forward<Args>(args)...); 
} 
h(f, 10);    // no decay of "f" here 
+1

注意:在(幾乎?)每個場景中C++模板替換以及「直接調用函數」這樣簡單的例子,[函數類型在使用時降級爲函數指針](http://stackoverflow.com/a/19200555/364696),所以沒有區別。我懷疑在模板的情況下,函數是模板定義的一部分,如果可能的話(如果它實際上不使用存儲非constexpr函數指針的變量),編譯器會內聯並撤銷函數的指針性。 – ShadowRanger

+0

我可以有一個類型爲void(int)的var,以及如何爲其賦值? – Derek

+0

@Derek:不,你不能有函數類型的變量,你不能有函數類型的prvalues,函數的返回值不能是函數類型。 –

5
void (*whatever)(int) 

應當被理解爲:無論是一個指針,指向一個函數,它接收一個INT作爲參數,並返回沒有任何東西(即無效)。

void whatever(int) 

應該讀作:無論是一個函數(不是指針),接受一個int值作爲參數,並且沒有返回

一旦指向函數初始化(即無效。)指向一個有效的函數(滿足原型的函數),那麼你可以通過它的「真實」名稱或通過指針來調用函數。

函數指針是非常有用的 - 他們是變量,就像別的,這樣你就可以通過他們周圍的其他功能(例如見的qsort()),你可以把它們放在結構等。

鑑於此,下面的代碼是有效的:

#include <stdio.h> 

void myfun(int x) { 
    printf("The value of X is %d\n", x); 
} 

int main() { 
    void (*myfunp)(int); 

    myfunp = &myfun; 

    myfun(13); 
    myfunp(12); 

    return 0; 
} 
相關問題