我无法弄清楚push_back(const value_type& val)的工作原理,在docs中说到val

val is Value to be copied (or moved) to the new element ...


通过引用引用val时如何复制?
该复制是否会调用val的复制构造函数?


这到底是怎么回事?

#include <iostream>
#include <vector>
using namespace std;
struct x
{
    x(int v = 0) : v(v) {}
    int v;
};
vector<vector<x>> parts;
void fillParts()
{
    vector<x> values = { x(1), x(2), x(3) };
    parts.push_back(values);
}
int main()
{
    fillParts();
    parts[0][0].v = -123;
    cout << parts[0][0].v;    // -123
    return 0;
}


这没有任何错误,
parts[0]是对本地向量values的引用还是副本?
如果它是参考,它是否应该至少给出一些警告,说明您正在访问和修改已释放堆栈的本地对象?

最佳答案

通过引用引用val时如何复制?


想想一个复制构造函数。
它通过引用获取参数,并且可以完美地执行复制。

class Bar
{
public:
    Bar(const Bar & rhs); // by reference, to copy.
};



  那个复制会调用val的复制构造函数吗?


复制操作使用复制构造函数。

通过提供用户定义的构造函数,您实际上可以查看它是被复制还是被移动。

struct x
{
public:
    x(const x & rhs)
    {
        // Some copy operation.
        std::cout << "Copied" << std::endl;
    }

    x(x && rhs)
    {
        // Some move operation.
        std::cout << "Moved" << std::endl;
    }
};

关于c++ - vector 推回澄清,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39077420/

10-12 23:59