2014-10-09 78 views
2

我有這樣的代碼:爲什麼移動構造函數不會調用沒有std :: move?

SomeType::SomeType(std::vector<Item>&& container, const float someOtherPArameter) 
    : internal_container(std::move(container)) 
{ 
    // some code here 
} 

有人可以給我解釋爲什麼一個移動構造函數並不要求不「的std ::移動」的「internal_container」?

+3

名稱的東西是左值(即使它們被聲明爲左值引用)。不要問我爲什麼 – 2014-10-09 02:28:57

+5

@Matt McNabb因爲程序可能仍然指向他們。哲學是,如果程序無法再看它,竊取對象的膽量(可能除了它的析構函數)也是可以的。只有未命名的臨時人員符合資格。 'std :: move'是程序覆蓋它的一種方式,以提供明確的許可。 – 2014-10-09 02:45:12

回答

2

無論何時從同一類型的xvalue初始化對象,都會調用移動構造函數。您可以致電std::move(x)創建xvalue。將參數聲明爲右值引用不會自動使其成爲xvalue

+0

在你的第一句話中,s/xvalue/rvalue /'。 – 2014-10-09 03:31:50

2

因爲

SomeType::SomeType(std::vector<Item>&& container, const float someOtherPArameter) 
    : internal_container(container) 
{ 
    // the parameter container is in scope here 
} 

這將是非常令人驚訝的,如果,在構造函數體內,訪問參數container發現了一個移動,從對象。 (它也會破壞在C++ 03中完全有效的代碼)

這就是爲什麼你必須明確地啓用移動。

相關問題