void(int)&的区别void(*)(int)

时间:2015-12-23 14:13:54

标签: c++

我知道void (*)(int)是指针函数,但void(int)是什么?

它用于std::function模板。

说我有一个功能void fun(int){}decltype(&fun)提供void(*)(int)decltype(fun)提供void(int)

3 个答案:

答案 0 :(得分:15)

如果T是一种类型,则T*表示“指针指向T”类型。

类型void(int)函数类型,它是一个函数的类型,只需一个int并返回void。例如,f如果f被声明为void f(int);

,则类型为T = void(int)

如果T*,则void(*)(int)拼写为T& = void(&)(int),因此后者是函数指针的类型。您还可以形成对函数的引用,即*;这有时更有用(例如,您可以获取函数左值的地址)。

除了注意:函数lvalues 很容易衰减到它们的函数指针。您可以通过函数左值或函数指针调用函数。当用作间接运算符(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

函数不会衰减的一些唯一时间是用作address-of运算符的操作数,或者当绑定到引用时:

public interface MarkerInterface {
    public String print();
}

答案 1 :(得分:8)

void (*whatever)(int) 

应该被理解为:无论是指向函数的指针,都接受一个int作为参数,并且不返回任何内容(即,void)。

void whatever(int)

应该被理解为:无论是函数(不是指针),接受一个int作为参数,并且不返回任何内容(即,void)

一旦指向函数的指针被初始化为指向有效函数(满足原型的函数),那么你可以通过它的&#34; real&#34;来调用函数。名称,或通过指针。

指向函数的指针是非常有用的 - 它们是变量,就像其他任何东西一样,所以你可以将它们传递给其他函数(参见例如qsort()),你可以将它们放在结构体中等等。 / p>

鉴于此,以下代码有效:

#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;
}

答案 2 :(得分:3)

void(*)(int)应该被读作指向function的指针的类型,它接受一个int作为参数,并且不返回任何内容。

要了解有关指针及其用法的更多功能,请点击此处:http://www.cprogramming.com/tutorial/function-pointers.html