簡體   English   中英

為什么復制構造器與移動構造器一起調用?

[英]Why Copy constructor is called along with Move Constructor?

這個問題似乎很奇怪,但是我已經檢查了多個編譯器。 在我的代碼中,我有一個Move Constructor和一個copy constructor

class A {
    int val;
public:
    A(int var) : val(var)  {
    }
    A( A && a1) {
        cout<<"M Value -> "<<a1.val<<endl;
        cout<<"Move Cons..."<<endl;
     }
    A(const A & a1) {
        cout<<"Copy Cons.."<<endl;
        cout<<"Value -> "<<a1.val<<endl;
    }
};

如果我將main功能寫為

int main()
{
    vector<A> v1;
    A a2(200);
    v1.push_back(move(a2));              
}

輸出是

M Value -> 200
Move Cons...

這是預期的,但是如果我將main功能更改為

int main()
{
    vector<A> v1;
    A a2(200);
    v1.push_back(A(100));
    v1.push_back(move(a2));

}

我得到以下輸出

M Value -> 100
Move Cons...
M Value -> 200
Move Cons...
Copy Cons..   // unexpected
Value -> 0    // unexpected

任何人都可以幫助我了解在何處以及如何調用此copy constructor ..值也為0

謝謝

評論中已經回答了原因。 我將嘗試說明發生了什么。

腳步:

vector<A> v1;

  1. 向量的分配。 它在內部為一個元素保留空間。

v1.push_back(A(100));

  1. 向量中A(100)構造和移動。

v1.push_back(move(a2));

  1. 由於您試圖插入一個超出實際最大大小的新元素,因此將其向量重新分配到新的內存空間。 請記住, std::vector將其內容保留在連續的內存中。
  2. v1內移動a2
  3. 將原始v1的其余元素(在這種情況下,僅第一個元素)復制到新v1

記憶:

1) ## v1[undef ] #########################
2) ## v1[A(100)] #########################
3) ##   [A(100)] ### v1[undef,  undef ] ##
4) ##   [A(100)] ### v1[undef,  A(200)] ##
5) ##   [A(100)] ### v1[A(100), A(200)] ##

附加條款:

與值0相關,這是因為這些復制和移動構造函數實際上不執行任何操作,並且val值保持未定義。 使用適當的構造函數,此日志應為100。

如果將move構造函數標記為noexcept ,它將在重新分配過程中使用,而不是復制副本。

您可以使用v1.emplace_back(100)代替v1.push_back(A(100))避免移動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM