2013-01-24 117 views
2

我的代碼如下unique_ptr移動的不同行爲?

std::vector<std::unique_ptr<int>> v; 
std::unique_ptr<int> a(new int(0)); 
std::unique_ptr<int>& b = a; 
v.insert(v.begin(), std::move(b)); //ok 

但是如果我在第三語句添加常量

const std::unique_ptr<int>& b = a; 
v.insert(v.begin(), std::move(b)); //Compiler error, cannot access ptr private member 

爲什麼編譯器顯示不能訪問除了不能轉換常量的唯一指針的私有成員非const?謝謝。

+7

爲什麼「爲什麼」?爲什麼不!?如果這個東西是const的,你很難期望能夠改變它... –

+1

@chris雖然沒有'move'調用代碼會*嘗試*一個副本並且無法編譯。 –

+1

@KonradRudolph:確實不會編譯,但不能移動const對象。移動正在改變狀態,'const'禁止該狀態。 –

回答

3

您無法移動const對象。移動意味着更改您從其移動的對象的狀態並將其聲明爲const承諾您不會更改該狀態。因此,移動const對象是一個矛盾的詞彙。

雖然能夠移動const對象可能確實有某種理由的預期(例如,你可能希望對象是const只要你使用它,然後幹掉它,當你已經完成並且轉移它的膽量而不是複製它 - 這是unique_ptr),實際上允許這會有一些非常不切實際的語義後果(例如,它允許交換兩個const對象) 。

因此,儘管漢語是技術上允許從const對象移動(move構造函數接受const器RRef是法律),沒有類型的標準庫,實際上爲您提供了可能性,包括unique_ptr,你不應該編寫任何有用的UDT。

概念,認爲移動作爲狀態變更操作,這是const修改兼容的它是非常重要的。

相關問題