函数变量而不是指向函数的指针

时间:2013-05-18 15:28:35

标签: c++

有这段代码:

void a() { }

// function parameter first defined as function, then as pointer to function
void g(void f() = a, void (*d)() = a) {
}

int main(){
   void (*z)() = a; // works ok
   //void z() = a; error: illegal initializer (only variables can be initialized)
   return 0;
}

在函数参数列表中,您可以将函数参数定义为函数或函数的指针(请参阅函数g参数列表)。但是在main函数中,只有指向函数版本的指针才有效。是否有某种方法可以在块范围内定义函数变量(不是指向函数的指针)(如void f() = a函数中的g变量)?

4 个答案:

答案 0 :(得分:2)

在C ++中不能包含函数类型的变量。但是,您可以使用指针或函数引用:

typedef void (funtype)();

void call(funtype & f) { f(); } // OK, funtype & == void (&)()
void call(funtype * g) { g(); } // Also OK, funtype * == void (*)()

在某种意义上,总是通过函数指针调用函数:值为函数的表达式会立即衰减到相应的函数指针。因此,在上面的示例中,f()(*f)()(**f)()等等都是调用函数的有效方法,同样适用于g。但是通过引用传递的优点是你仍然可以通过说&f来明确地获得函数指针。

答案 1 :(得分:0)

函数f的参数g实际上是函数指针类型。任何函数类型参数都转换为函数指针类型:

  

在确定每个参数的类型后,任何类型为“T of T”或“函数返回T”的参数都将被调整为“指向T的指针”或“指向函数返回T的指针”。

但是,正常的变量声明不会发生这种情况。 void z() = a;声明一个函数,然后尝试初始化它。你不能这样做,因为函数不是变量。

答案 2 :(得分:0)

没有“函数变量”之类的东西,它必须是指针或对函数的引用。 (其他语言可能只是隐藏变量是指针或引用的事实。)

答案 3 :(得分:0)

void g(void f() = a)中,f不是函数类型;它是一个指向函数的指针。 (参见void h(int x[3]),其中x是指向int的指针)。在void f() = a; f中确实是一个函数类型,你不能创建一个函数类型的变量。