函数参数列表中的`&`
`&` 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)
去掉 typedef
s,我们有:
void fun1(mystrct*& val);
fun1(&foo);
fun1
接受指向 mystrct
的指针的左值引用。 &foo
确实是指向 mystrct
的指针,但它是右值(特别是纯右值),而不是左值,因此类型不匹配。您可以将其视为 &foo
是一个临时值,并且您不能对临时值进行非常量左值引用。
这与尝试执行以下操作的等效错误:
void fun(int& );
fun(1);
fun2
只需要一个指针 - 而不是引用 - 所以 fun2(&foo)
完全没问题。
我在一些代码中看到了这一点,但我对一件事感到困惑:
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)
去掉 typedef
s,我们有:
void fun1(mystrct*& val);
fun1(&foo);
fun1
接受指向 mystrct
的指针的左值引用。 &foo
确实是指向 mystrct
的指针,但它是右值(特别是纯右值),而不是左值,因此类型不匹配。您可以将其视为 &foo
是一个临时值,并且您不能对临时值进行非常量左值引用。
这与尝试执行以下操作的等效错误:
void fun(int& );
fun(1);
fun2
只需要一个指针 - 而不是引用 - 所以 fun2(&foo)
完全没问题。