函数参数列表中的"&"

`&` in function parameter list

本文关键字:参数 列表 函数      更新时间:2023-10-16

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

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)不编译的地方?

去掉typedef s,我们有:

void fun1(mystrct*& val);
fun1(&foo);

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

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

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

fun2只接受指针 - 而不是引用 - 所以fun2(&foo)完全没问题。

它将参数声明为引用。参数变为输入/输出,而不是仅C++/C 的正常输入。

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

 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 的旧时代所做的,以使结构读/写

void fun2(ptr_mystrct val)