2016-08-22 61 views
0

我无法弄清楚如何push_back(const value_type& val)正好作品,docs它说,大约val矢量推背澄清

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

  1. 怎么可以当它通过引用,采用val复制?

  2. 该复制是否会调用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或副本的参考? 如果它是一个引用,它不应该至少给出一些警告,说你访问和修改本地对象的释放堆栈?

+0

使用复制构造函数复制值,''''vector'在执行'push_back'时复制'values'向量,所以在访问它们时它们不会被释放。局部变量'values'确实被释放,但是具有相同下层数据的复制向量存储在'parts'中。 –

+0

@JavierMr是的,但'push_back'需要引用 - 那么它如何执行'values'向量的复制? – ampawd

+1

@ampawd为什么不呢? '复制构造函数'一般参考,它完美地执行复制。 –

回答

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

注意:对于'struct x'和问题中一样,你会想要在这些构造函数中实际执行成员变量的副本! –

+0

是'vector'拷贝构造函数看起来像这样'vector (const vector &rhs)'? – ampawd

+0

@ampawd你被混淆在'x'和'std :: vector'的构造函数之间。现在,您正在查看此复制操作的其他(或错误)方面。你正在调用'push_back',(不是构造函数) –

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

我得到了拷贝利弊称为调试和发布版本。