std::vector 是否有用于引用的复制构造函数?

Does std::vector have a copy constructor for references?

本文关键字:复制 引用 构造函数 用于 vector 是否 std      更新时间:2023-10-16

当我看到这样的代码并且它起作用时,我很惊讶:

#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();,复制构造函数用于初始化subvecconst std::vector<int>&。没有像复制构造函数这样的东西作为参考,在重载解析中,将考虑引用本身以外的引用对象;引用只是别名。(并且由于其他原因,也没有复制构造器采用指针,如果有构造函数采用指针,则不会再次成为复制构造函数。

将命名变量声明为引用,即对已存在的对象或函数的别名。

vecstd::vector<int>的向量。subvec的初始化:

std::vector<int> subvec = vec.back(); 

将最后一个std::vector<int>元素复制到subvec中。你不是在subvec存储对vec的引用,而是在存储副本。这些是独立的。


初始化subvec所涉及的构造函数重载为:

vector(const vector& other);

back()成员函数返回一个左值引用,该引用可以绑定到上述构造函数采用的const左值引用。因此,不需要为左值引用添加额外的构造函数重载。