为什么引用unique_ptr会以这种方式行事
Why does referencing an unique_ptr behave this way?
vector<int> v1, v2;
/*1*/ vector<int> &someReference=v1; //compiles
/*2*/ someReference=v2; //compiles
vector<unique_ptr<int>> vec1, vec2;
/*3*/ vector<unique_ptr<int>> &otherReference=vec1; //compiles
/*4*/ otherReference=vec2; //ERROR
如果第 3 行和第 4 行都没有编译,我会理解,但第三行不会导致任何编译错误 - 显然第一次初始化引用并传递它没有问题; 问题仅在我尝试第二次分配它时出现。
我不明白幕后发生了什么,使第二个任务无法完成。
这与引用无关,这是无法复制的unique_ptr
。
unique_ptr<int> p1, p2;
p1 = p2; // error
因此,unique_ptr
的向量也无法复制。
vector<unique_ptr<int>> vec1, vec2;
vec1 = vec2; // error
问题是你正在将vec1
分配给vec2
,而这无法完成,因为向量的内容是不可分配的。
这
otherReference=vec2;
与
vec1 = vec2;
因为otherReference
是vec1
的别名。无论在表达式中看到otherReference
的任何地方,都可以将其替换为 vec1
。
初始化引用与赋值有很大不同。初始化引用时,将其设置为引用对象。此后,使用引用实际上意味着使用引用的对象。这意味着分配给"引用"实际上意味着分配给引用对象。
在您的情况下,分配是非法的,因为std::unique_ptr
无法复制(因此,当然,它们的向量也不能复制(。
相关文章:
- 创建引用向量的优雅方式
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 引用 std::any 或 not_yet_in_std::whatever 的惯用方式是什么?
- 打印从SQLite3数据库检索的数据C++与命令行中相同的方式
- 文件追加的方式是,它在每次保存C++后结束行
- 尝试构建 xerces c++ 解析器。Netbeans 和命令行构建错误未定义对"xercesc_3_2..."的引用
- 为什么我的代码在添加不相关的代码行后工作方式不同?
- 使用 python 绑定来检查 C++ 类型是否是规范方式的指针、引用等?
- 如何控制 clang 格式新行中 lessless 的对齐方式
- Apple Mach-O-Linker 错误:在体系结构 x86-64 中找不到从(行)引用的变量
- 在 Windows 命令行中运行.exe在使用 2 种相同方式执行时会产生不同的输出
- 包含具有无效位置的节点引用的方式
- 如何在C++中传递对打开串行端口的引用
- 如何以编程方式查找从 html 引用的所有文件
- 以编程方式输入新行
- Rcpp:通过引用将行追加到数据帧
- 有没有办法在函数以编程方式返回的引用上多次调用函数? -元组动态访问
- 是否可以更改 Xcode 缩进注释行的方式
- Arduino和Visual Studio C ,2方式串行通信
- Visual C++编译器为不明确的符号提供了错误的行引用