2015-10-15 85 views
1

我知道這個問題被問了一百萬次。大部分答案都只是說對象應該是CopyAssignable和CopyConstructible。但是documentation明確說這是規則(直到C++ 11)!但仍然無效。爲什麼?stl容器的引用C++ 11

回答

8

是的,現在的要求不那麼嚴格。然而,右下方你引用的部分,鏈接的文檔明確指出認爲:容器進行的

所上的元素強加的要求取決於實際操作。一般來說,要求元素類型是完整類型並且符合Erasable的要求,但是許多成員函數會施加更嚴格的要求。 (因爲C++ 11)

引用並不滿足可擦寫的要求,因此他們仍然不能正常工作。

8

規則適用,直到C++ 11。在C++ 11中,要求元素類型是完整類型,並且符合Erasable的要求,在這種情況下引用不是。

但是,您可以使用std::reference_wrapper來包裝引用並將它們存儲在向量中。

std::vector<std::reference_wrapper<T>> vector_of_references; 
+1

是的,我知道'std :: reference_wrapper'。我仍然不確定規則。你是否說文檔中有錯誤? – nikitablack

+1

@101010這不是一個額外的要求 –

+0

@101010新的要求不像以前那樣嚴格C++ 11。一個類型不再需要是CopyAssignable和CopyConstructible,只要它是可擦除的就可以在矢量中使用。 – user2079303

4

§23.2.1 [container.requirements.general]¶1 N4140的說(重點煤礦):

容器是存儲其它對象對象。它們通過構造函數,析構函數,插入和擦除操作來控制這些對象的分配和釋放。

但是引用不是一個對象,所以你不能把它放到一個標準的庫容器中。

6

C++ 11放寬了容器需求,以便在容器中使用非CopyConstructible類型,只要避免需要複製元素的操作即可。

這並不意味着引用是允許的,但僅僅因爲一條規則放鬆並不意味着絕對可以將任何類型放入容器中。

由於cppreference頁面你報says爲C++ 11

所上的元素強加的要求取決於容器進行的實際操作。一般而言,要求元素類型是完整類型,並且滿足Erasable的要求,但是許多成員函數提出了更嚴格的要求。

Erasable要求,這是有效的:

allocator_traits<A>::destroy(m, p) 

在17.6.3.5 [分配器的Allocator要求。要求]說分配器處理任何非const對象類型和引用不是對象類型,所以你不能分配或釋放一個引用,因此你不能把它們放在容器中。