c++ - std::vector 是否有用于引用的复制构造函数?
问题描述
当我看到这样的代码并且它起作用时,我感到很惊讶:
#include <vector>
#include <iostream>
int main() {
std::vector<std::vector<int>> vec{{1,2,3},{4,5,6}};
std::vector<int> subvec = vec.back();
vec.pop_back();
for (int i : subvec) {
std::cout << i << std::endl;
}
}
我想std::vector<int> subvec = vec.back();
知道vec.pop_back();
. 一开始我以为它会失败。vec.back()
返回对在下一行销毁的元素的引用。然后我认为它正在调用std::vector
. 但是如果vec.back()
返回一个引用,这是否意味着它std::vector
有一个单独的指针复制构造函数?当我尝试用自己的类构建示例时,这是我能够复制行为的唯一方法。
解决方案
给定std::vector<int> subvec = vec.back();
,subvec
是从vec.back()
. 即使vec.back()
是按引用返回,也是一个全新的对象,与原来的( )subvec
无关;根本不会影响它。vector
vec.back()
vec.pop_back();
另一方面,如果您声明subvec
为引用,则
std::vector<int>& subvec = vec.back(); // subvec refers to vec.back() too
vec.pop_back(); // subvec becomes dangled
for (int i : subvec) { // UB
std::cout << i << std::endl;
}
但是如果
vec.back()
返回一个引用,这是否意味着它std::vector
有一个单独的指针复制构造函数?
不。对于std::vector<int> subvec = vec.back();
,复制构造函数const std::vector<int>&
用于初始化subvec
。没有像引用的复制构造函数这样的东西,在重载决议中,除了引用本身之外的被引用对象将被考虑;参考只是别名。(并且由于其他原因,没有复制构造函数获取指针,如果有构造函数获取指针,它将不再是复制构造函数。)
将命名变量声明为引用,即已存在对象或函数的别名。
推荐阅读
- node.js - 无效的频道名称 - 可能是什么原因造成的?
- python - 什么是神经网络在张量流中执行
- node.js - 通过咖啡脚本中的承诺和循环避免内存泄漏(无等待)
- java - 无需再次读取文件即可获取全局变量的值
- javascript - 为什么 array.splice() 在用于作为其副本的变量时会更改变量?
- c# - Monogame:在类中创建绘图函数
- r - 如果另一个感兴趣的变量不止一次出现,则如果存在 NA 则子集行?
- jquery - AJAX 在自定义 wp_loop 中加载更多发布按钮
- firebase - Firebase Cloud Functions 升级停机时间
- authentication - Asp core 2.2 多重认证