2010-12-15 46 views
1

我是新來移動構造函數,並與VS2010的行爲相當混淆。 我設計了一個移動構造函數(A類),這在我的知識是這樣的:在VS2010中移動構造函數,非const拷貝構造函數,列表的emplace

A(A&& input) {some code} 

當我使用列表的佈設,並把A類的一個實例:

mylist.emplace(a); 

我的移動構造函數是不叫,和一個非常拷貝構造函數被調用來代替:當我做這個

A(A& input) {the same code as move constructor} 

在另一方面:

mylist.emplace(A(2)); 

我的移動構造函數被稱爲它應該的。所以,我的問題是:

  1. 爲什麼列表的emplace調用我的非const拷貝構造函數而不是我的移動構造函數?
  2. 非const拷貝構造函數實際上是定義移動構造函數的替代方法嗎?
  3. 此行爲是否正確(對於C++ 0x編譯器)還是隻是VS2010的行爲?

非常感謝大家。

+0

如果您的拷貝構造函數與您的移動構造函數具有相同的行爲,是不是嚴重破壞了類? – UncleBens 2010-12-15 21:37:30

+0

@UncleBens:不一定,兩者都可以做一個副本。 – ybungalobill 2010-12-15 21:38:24

+0

@ybungalobill:在這種情況下,爲什麼要定義(而不是禁用)移動構造函數?如果複製構造函數創建一個副本,爲什麼它需要一個非const引用? – UncleBens 2010-12-15 22:00:10

回答

2
mylist.emplace(a); 

這裏a是一個l值,因此它被複制而不是移動。你需要明確地move

mylist.emplace(std::move(a)); 

是的,行爲是正確的。