gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:21:14 25 4
gpt4 key购买 nike

当我看到这样的代码并且它有效时,我感到很惊讶:

#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;
}

But if vec.back() is returning a reference, does that mean that std::vector has a seperate copy constructor for pointers?

没有。对于 std::vector<int> subvec = vec.back(); ,复制构造函数取 const std::vector<int>&用于初始化subvec 。不存在像复制构造函数这样的东西用于引用,在重载解析中,将考虑引用本身以外的引用对象; reference只是别名。 (并且没有复制构造函数出于其他原因获取指针,如果有构造函数获取指针,它就不会再次成为复制构造函数。)

Declares a named variable as a reference, that is, an alias to an already-existing object or function.

关于c++ - std::vector 是否有用于引用的复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59116672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com