2016-08-22 40 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; 
} 

我得到了拷貝利弊稱爲調試和發佈版本。