每當我需要創建一個非複製構造對象的數組時,我偶爾會遇到這種情況。例如:爲什麼std :: vector fill構造函數不能啓用安裝?
std::vector<std::thread> thread_pool(NUM_CORES, std::thread(some_function));
這樣很方便。但是,唉,std::vector
填充構造函數似乎沒有任何R值的支持。它被定義爲:
vector(
size_type count,
const T& value,
const Allocator& alloc = Allocator()
);
但它會極爲方便有:
vector(
size_type count,
T&& value,
const Allocator& alloc = Allocator()
);
然後該載體可在內部分配必要的緩衝器大小,並移動-構造每個元件與放置新。
但是...... C++ 11標準(顯然甚至是C++ 14標準)不提供這種功能。所以,現在 - 當我有一個線程向量時,我不得不說:
std::vector<std::unique_ptr<std::thread>> thread_pool(NUM_CORES);
/* now loop over vector and initialize elements one by one */
有沒有什麼理由將這種能力排除在外?有危險嗎?或者我沒有看到一些問題?
一個更好的方式「解決辦法」將是' std :: vector v; v.reserve(NUM_CORES); for(...)v.emplace_back(...);'。不需要指針。答案可能是「因爲從來沒有人打算提出這個問題」。 –
stefan
2014-10-30 18:13:53
在移動構造或賦值之後,右值引用保持有效但未知的狀態。你真正想要的是能夠有像emplace_back這樣的可變構造函數。但是如果任何T構造函數的參數都是右值,那麼右值將再次提升。 @stefan解決方法就是我通常所做的。 – galop1n 2014-10-30 18:16:03
大聲笑你如何建議移動 - 從一個原始參數構造多個元素? – 2014-10-30 18:22:14