举个例子。我创建了一个名为 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/