函数参数列表中的"&"
`&` 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)
不编译的地方?
去掉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)
相关文章:
- 概念中的cv限定符需要表达式参数列表
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 错误 没有与参数列表匹配的重载函数"getline"实例
- std::vector 没有重载函数的实例与参数列表匹配
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 构造函数/函数声明参数列表中的统一初始化
- 模板化检查是否存在带有参数列表的类成员函数?
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 带有整数的变量参数列表
- 转发变量参数列表以模拟 std::thread
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- C++-将具有引用的长参数列表重构为结构
- 缺少别名模板C++参数列表
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 没有函数模板的实例与我不知道为什么的参数列表匹配
- 我可以使用宏自动构建参数列表吗?
- 类成员函数参数列表是否可以依赖于模板参数?