2014-10-30 85 views
0

每當我需要創建一個非複製構造對象的數組時,我偶爾會遇到這種情況。例如:爲什麼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 */ 

有沒有什麼理由將這種能力排除在外?有危險嗎?或者我沒有看到一些問題?

+2

一個更好的方式「解決辦法」將是' std :: vector v; v.reserve(NUM_CORES); for(...)v.emplace_back(...);'。不需要指針。答案可能是「因爲從來沒有人打算提出這個問題」。 – stefan 2014-10-30 18:13:53

+4

在移動構造或賦值之後,右值引用保持有效但未知的狀態。你真正想要的是能夠有像emplace_back這樣的可變構造函數。但是如果任何T構造函數的參數都是右值,那麼右值將再次提升。 @stefan解決方法就是我通常所做的。 – galop1n 2014-10-30 18:16:03

+4

大聲笑你如何建議移動 - 從一個原始參數構造多個元素? – 2014-10-30 18:22:14

回答

4

你提出什麼是不可行的,因爲,就其本質而言,移動是一個國家從一個對象轉移到一個其他物體。通過同時將狀態從一個狀態移動到全部狀態,不能構造對象。

星際之門的宇宙通過引入能夠同時打開一個蟲洞到銀河系的每個門的能力而違反了這條規則,這根本沒有意義,並且真的讓我惱火。不要那個人!

矢量構造看起來像這樣:

template <typename T> 
template <typename Args...> 
std::vector<T>::vector(const size_t n, Args&&... args); 

&hellip;繼emplace模型可能工作,但我擔心,這將是很容易得到一個模棱兩可的超負荷由於現有的構造函數的絕對數量爲std::vector<T>。我懷疑這就是爲什麼它沒有完成,除了事實並非真的有必要。

因爲,現在,你可以通過安放一個在時間,這不分,很可能是因爲高性能的,你能指望得到變通辦法:

std::vector<std::thread> v; 
v.reserve(NUM_CORES); 
for (/*...*/) 
    v.emplace_back(/*...*/); 
相關問題