我知道這個問題被問了一百萬次。大部分答案都只是說對象應該是CopyAssignable和CopyConstructible。但是documentation明確說這是規則(直到C++ 11)!但仍然無效。爲什麼?stl容器的引用C++ 11
1
A
回答
8
是的,現在的要求不那麼嚴格。然而,右下方你引用的部分,鏈接的文檔明確指出認爲:容器進行的
所上的元素強加的要求取決於實際操作。一般來說,要求元素類型是完整類型並且符合Erasable的要求,但是許多成員函數會施加更嚴格的要求。 (因爲C++ 11)
引用並不滿足可擦寫的要求,因此他們仍然不能正常工作。
8
規則適用,直到C++ 11。在C++ 11中,要求元素類型是完整類型,並且符合Erasable的要求,在這種情況下引用不是。
但是,您可以使用std::reference_wrapper來包裝引用並將它們存儲在向量中。
std::vector<std::reference_wrapper<T>> vector_of_references;
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對象類型和引用不是對象類型,所以你不能分配或釋放一個引用,因此你不能把它們放在容器中。
相關問題
- 1. C++ STL容器和引用
- 2. 從C++中繼承STL容器11
- 3. C++ 11 STL容器內shared_pointer常量性
- 4. C++ STL容器
- 5. STL中的容器C++
- 6. C++ 11:is_member_pointer對於許多STL容器功能
- 7. C++中的通用STL兼容直方圖11
- 8. 用於STL容器的C++ IDE
- 9. C++ STL容器:: clear :: swap
- 10. STL:容器的容器
- 11. C++ STL;迭代包含STL容器的類嗎?
- 12. 容器訪問比較器(C++/STL)
- 13. C++ STL容器的空間複雜性
- 14. STL容器上的C++模板函數
- 15. STL容器的範圍插入函數在C++ 11下返回void?
- 16. stl兼容的容器
- 17. C++ 11 rvalue引用
- 18. 獲取迭代器引用的指向STL容器的指針?
- 19. C++中的Rvalue(引用)11
- 20. 同時使用STL容器
- 21. 自動終止C++ 11 STL線程
- 22. 在C++中迭代STL類11
- 23. 插入C++ map STL容器失敗
- 24. 在Windbg中調試C++ STL容器
- 25. 將STL/C++/CLI容器傳遞給.Net
- 26. C++ STL容器和就地建設
- 27. STL容器'difference_type typedef
- 28. 關於STL容器
- 29. 獨特的STL容器
- 30. STL容器VS的Structs
是的,我知道'std :: reference_wrapper'。我仍然不確定規則。你是否說文檔中有錯誤? – nikitablack
@101010這不是一個額外的要求 –
@101010新的要求不像以前那樣嚴格C++ 11。一個類型不再需要是CopyAssignable和CopyConstructible,只要它是可擦除的就可以在矢量中使用。 – user2079303