矢量推回澄清

时间:2016-08-22 10:40:17

标签: c++ visual-c++ stl push-back

我无法弄清楚push_back(const value_type& val)究竟是如何运作的,docs它说的是val

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

  1. 如何通过引用val复制它?

  2. 该复制是否会调用val的复制构造函数?

  3. 这到底发生了什么?

    #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的引用还是副本? 如果它是一个引用不应该至少给出一些警告说你访问和修改释放堆栈的本地对象?

2 个答案:

答案 0 :(得分:3)

  

如何通过引用获取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;
    }
};

答案 1 :(得分:0)

你可以试试这个

class A
{
public:
    A() {}
    A(const A&) { cout << "copy cons" << endl; }
    A& operator= (A &&) { cout << "move" << endl; };
    A& operator= (const A &) { cout << "copy" << endl; };
};
vector<A> parts;
void fillParts()
{
    A a;
    parts.push_back(a);
}
int main()
{
    fillParts();
    return 0;
}

我在调试和发布版本中都调用了复制缺点。