2012-10-28 43 views
5

我注意到,它的elememt類型T上的std :: vector的需求已從C++ 03更改爲C++ 0x。現在T不需要複製,但移動構造性就足夠了。矢量元素需要移動嗎?

即使我們不潛在重新分配,是否需要T?

vector<boost::scoped_ptr<int>> x(numberElements); 

我沒有看到這裏需要搬家。規格說明是什麼?

+0

好吧,這是標準所要求的......即使您的實際實現可能適用於非移動對象。 –

+0

@kerrek在我看來,這是一個與'new'陣列相比的主要特性損失。這是什麼要求的原因? –

+0

對於「僅一次」分配,您總是可以使用'std :: unique_ptr p(new T [N])'。這個要求只是標準容器要求的一部分......我不知道爲什麼它不包含很多特殊的例外情況,除了保持簡單的概念之外。例如,你可以使用'std :: vector >'來獲得C++ 11中完全相同的生成代碼作爲你自己的解決方案,所以它在任何意義上都不是什麼新鮮事。 –

回答

3

根據23.3.6.2 [vector.cons]第4段,您使用的構造函數需要DefaultInsertable。由於構造函數不是需求表的構造函數之一,也要求CopyInsertable,因此不應該有任何附加要求。根據23.2.1 [container.requirements.general]段13,DefaultInsertable意味着以下表達式是公形成:

allocator_traits<A>::construct(m, p); 

看來,這意味着該答案取決於所使用的分配器A。我不太想分析20.6.7.2 [allocator.uses.construction]的更深層意思。讓我們做教練逃跑吧:確定這個段落意味着什麼留下來作爲一個練習!

+0

+1 *此構造函數只有''T'需要''DefaultInsertable''。 'T'不必是'MoveConstructible'和'CopyConstructible'。當使用默認分配器時,'DefaultInsertable'暗示'DefaultConstructible'。約翰內斯的代碼是符合的(假設'boost :: scoped_ptr '在範圍內並且意味着我們所有人認爲它的意思)。 –

+0

@howard啊,謝謝你的解釋。現在我可以睡了,而不用擔心我的代碼。 –

+0

@ JohannesSchaub-litb:我說它符合不便攜性。 ;-)在這個時候,我不確定有多少實現是正確的。我知道libC++是。我很想聽聽其他實現如何與您的示例一起工作。 –