![](/img/trans.png)
[英]In abscence of move constructor the copy constructor is called ? Why is that?
[英]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;
v1.push_back(A(100));
A(100)
構造和移動。 v1.push_back(move(a2));
std::vector
將其內容保留在連續的內存中。 v1
內移動a2
。 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.