首页 > 解决方案 > 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有一个单独的指针复制构造函数?当我尝试用自己的类构建示例时,这是我能够复制行为的唯一方法。

标签: c++reference

解决方案


给定std::vector<int> subvec = vec.back();,subvec是从vec.back(). 即使vec.back()是按引用返回,也是一个全新的对象,与原来的( )subvec无关;根本不会影响它。vectorvec.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。没有像引用的复制构造函数这样的东西,在重载决议中,除了引用本身之外的被引用对象将被考虑;参考只是别名。(并且由于其他原因,没有复制构造函数获取指针,如果有构造函数获取指针,它将不再是复制构造函数。)

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


推荐阅读