std::vector 是否有用于引用的复制构造函数?
Does std::vector have a copy constructor for references?
当我看到这样的代码并且它起作用时,我很惊讶:
#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();
,复制构造函数用于初始化subvec
const std::vector<int>&
。没有像复制构造函数这样的东西作为参考,在重载解析中,将考虑引用本身以外的引用对象;引用只是别名。(并且由于其他原因,也没有复制构造器采用指针,如果有构造函数采用指针,则不会再次成为复制构造函数。
将命名变量声明为引用,即对已存在的对象或函数的别名。
vec
是std::vector<int>
的向量。subvec
的初始化:
std::vector<int> subvec = vec.back();
将最后一个std::vector<int>
元素复制到subvec
中。你不是在subvec
存储对vec
的引用,而是在存储副本。这些是独立的。
初始化subvec
所涉及的构造函数重载为:
vector(const vector& other);
back()
成员函数返回一个左值引用,该引用可以绑定到上述构造函数采用的const
左值引用。因此,不需要为左值引用添加额外的构造函数重载。
- 深层复制具有自引用指针的类
- 对复制 CTOR 和 CTOR 的未定义引用
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 关于隐式声明的复制构造函数的引用在逻辑上不清楚
- C++:右值引用构造函数和复制省略
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- 如何复制只引用基类的派生类
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- C++为具有引用成员变量的类创建复制构造函数
- std::vector 是否有用于引用的复制构造函数?
- 是复制了新数组还是指向结构中引用的数组的指针?
- 可移动但不可复制的对象:按值传递还是按引用传递?
- 通过引用传递是否涉及复制地址
- 复制引用结构上的赋值
- 在 c++ 中复制对未初始化对象的引用
- C++自动生成的具有常量和非常量引用的复制构造函数
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- Icpc错误隐式生成的赋值运算符无法复制引用成员(boost图)
- 函数复制引用字符数组中的数据