c++ - 函数指针语法歧义

标签 c++

举个例子。我创建了一个名为 s 的函数指针,将其设置为 f 并调用它。这当然编译得很好:

void f() {}

int main() {

    void (*s)();

    s = f;

    s();

}

但以下一个示例为例,我现在将 s 声明为“函数引用”(如果这样调用)并设置为 f 内联。这编译也很好:

void f() {}

int main() {

    void (&s)() = f;

    s();

}

这两种创建和初始化函数指针的方法有什么区别?请注意,当我使用引用语法时,我需要将其“内嵌”初始化为 f,而使用“指针”语法时,我可以同时进行这两种操作。你也能解释一下吗?那么,您能否解释一下它们在可用性方面的差异,以及我什么时候必须使用一种形式而不是另一种形式?

最佳答案

从根本上说,调用方没有明显的区别。但 decl 方肯定会这样做。正如您所指出的,必须将引用初始化为引用某物。这使它们“更安全”,但即便如此也无法保证“安全”。

函数指针根本不需要指向一个函数。它可以是 NULL,甚至是未初始化的(指向垃圾)。这并不重要,因为您以后可以随时更改它(这是您不能使用引用做的事情)。

void (*s)();  // uninitialized

void (*s)() = NULL; // set to null

以后

void foo() 
{
}

s = foo;

你不能用引用来做这些。引用必须初始化为某物,最好是有效:

void (&f)() = foo;   // ok. also references foo().
void (&f)() = *s;    // also ok, but wait, is s valid?? does it have to be??

但是,即使在这里,函数引用也不能保证安全,只是更安全。你当然可以这样做:

void (*s)();
void (&f)() = *s;

你可能会得到一个编译器警告(我是这样的,“s used before being initialized”)但最后 f 现在仍然是对 的“函数”的引用根本不是一个函数;只是 s 指针中的随机堆栈垃圾。更糟糕的是,因为无法重新分配引用。这东西总是指向垃圾。

关于c++ - 函数指针语法歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13167437/

相关文章:

c++ - 可以通过地址访问私有(private)变量吗?

c++ - 这个指针赋值应该产生段错误?

c++ - 设计一个带有两个指向嵌套对象的指针的迭代器

c++ - 两个 dll 导出相同的函数,调用哪个?

.net - 当我的进程被终止时到底发生了什么?

c++ - 合乎逻辑!与无

带有复制构造函数的 C++ 不能很好地工作

c++ - 以相反的顺序添加选项卡?

c++ - Qtimer不超时QT,C++

c++ - 从子调用 QtWidget 父方法