是否在C++中通过"隐含"(?)引用时制作的副本
Is a copy made when passing by 'implied'(?) reference in C++
如果我有一个引用映射的函数:
pair<int,int> myFunc(map<int,char> &myVar){...}
我可以把地图传给它,而不需要"&"。
myFunc(someMapitoa);
有什么不同吗?是复制后扔掉的吗?我应该使用"&"无论如何
C++默认为按值传递。
因此,这是一个副本:
void foo (bar b);
这不是:
void foo (bar & b);
这会复制指针,但不会复制它所指向的实际数据:
void foo (bar * b);
如果你真的想更深入地了解它,那么看看这篇关于移动语义的SO文章。
无论如何,对于以上三个例子,它们都以相同的方式被称为:
#include <iostream>
using namespace std;
int alpha (int arg) {
// we can do anything with arg and it won't impact my caller
// because arg is just a copy of what my caller passed me
arg = arg + 1;
return arg;
}
int bravo (int & arg) {
// if I do anything to arg it'll change the value that my caller passed in
arg = arg + 1;
return arg;
}
int charlie (int * arg) {
// when we deal with it like this it's pretty much the same thing
// as a reference even though it's not exactly the same thing
*arg = *arg + 1;
return *arg;
}
int main () {
int a = 0;
// 1
cout << alpha (a) << endl;
// 1
cout << bravo (a) << endl;
// 2
cout << charlie (&a) << endl;
return 0;
}
您应该从初始化内容的角度来考虑这一点。
调用函数时,每个参数都用于初始化相应的参数。如果参数是用引用类型声明的,那么它就是一个引用。如果参数没有用引用类型声明,那么它就是一个对象。
- 从类型为
T
的表达式初始化对类类型T
的引用从不进行复制 - 从类型为
T
的表达式初始化类别为T
的对象可以复制或移动
这里的规则与初始化非参数变量的规则相同,如:
T t = ...
T& r = ...
即使在调用位置没有显式表示法的情况下,函数也可能引用参数,这一事实被一些人认为是令人困惑的。这就是为什么一些样式指南禁止非const
引用参数(如Google C++样式指南),并强制您将该参数声明为指针,以便必须在调用站点使用&
。我不提倡这种编码风格,但这是您可能需要考虑的一个选项。
相关文章:
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 标准库容器结构是否存储副本或引用?
- 如何声明接受转发引用并返回引用或副本的函数模板
- 如何在我的源代码中找到所有发生的情况,其中std :: string被传递给方法作为副本而不是恒定引用
- 取消引用指针以创建数组的副本
- 返回不带副本 ctor 的引用
- 为什么在C 11中推荐的值(如果需要副本),如果const引用也只花费单个副本,则建议通过值(如果需要副本)
- 如何通过制作副本从函数返回引用
- 可以在同一函数中引用副本本地变量是否可以
- 为什么从三元文字中绑定到const引用副本
- 传递常量引用与创建临时常量副本相同,那么为什么要传递常量引用
- 为什么在 constexpr 函数中允许返回对常量指针的引用,但不返回副本
- 初始化引用时何时以及为何获得副本
- 处理对“vector_binary_operation”类中“表达式”的引用,而无需不必要的副本
- 按方法返回副本或引用
- 您能否从抽象引用创建具体对象的副本
- 常量引用和创建副本
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员