2015-12-23 149 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; 
} 
相关问题