函数参数列表中的`&`

`&` in function parameter list

我在一些代码中看到了这一点,但我对一件事感到困惑:

struct mystrct {...};
typedef mystrct* ptr_mystrct;

void fun1(ptr_mystrct &val)
{...}
void fun2(ptr_mystrct val)
{...}

main()
{
  mystrct foo;
  ptr_mystrct ptr_foo = &foo;
  fun1(ptr_foo);
  fun2(&foo); //this works fine
  fun1(&foo); //this is NOT valid (compiler error)
}

val 之前的 & 的目的是什么?起初我以为它会将地址指向指针(val 将指向 ptr_foo 位置)但显然不会。

此外,为什么 fun2(&foo) 编译而 fun1(&foo) 不编译?

它将参数声明为引用。参数变为 in/out 而不是 C++/C 的 normal in only.

这会更新传递给函数的结构。

 void fun1 (ptr_mystruct &val)
 {
    val = somevalue ;
 }

这会更新 fun2 中的参数副本,因此调用者永远不会看到更改。

 void fun2 (ptr_mystruct val)
 {
    val = somevalue ;
 }

这里 fun2 需要一个指向结构的指针。作品

fun2(&foo); //this works fine

此处 fun1 需要一个指向结构的指针,而您正在传递一个指向指针的指针:

fun1(&foo); //this is NOT valid (compiler error)

恕我直言,此示例的间接级别比 fun1 所需的级别多。这是通过引用传递的结构真正需要的:

void fun1(mystrct &val)

这就是在引用之前使用 C 来构建结构的做法 read/write

void fun2(ptr_mystrct val)

去掉 typedefs,我们有:

void fun1(mystrct*& val);

fun1(&foo);

fun1 接受指向 mystrct 的指针的左值引用。 &foo 确实是指向 mystrct 的指针,但它是右值(特别是纯右值),而不是左值,因此类型不匹配。您可以将其视为 &foo 是一个临时值,并且您不能对临时值进行非常量左值引用。

这与尝试执行以下操作的等效错误:

void fun(int& );
fun(1);

fun2 只需要一个指针 - 而不是引用 - 所以 fun2(&foo) 完全没问题。