原因std::vector<T const>
是不允許的,因爲在插入不同於開頭的位置時,矢量中的對象可能需要重新洗牌。現在,成員std::vector<T>::push_back(T const& v)
在概念上等同於(離開分配器模板參數了,因爲它是不相關的討論)
template <typename T>
void std::vector<T>::push_back(T const& v) {
this->insert(this->end(), v);
}
這似乎是它是如何在一些實現來實現。現在,這個操作通常需要一些對象可能需要移動,因此參數需要是可分配的。似乎使用MSVC++的標準庫不會委託操作,但會執行所有必要的處理,即在空間不足時適當調整數組大小並移動對象,其格式爲push_back()
。目前尚不清楚T
型號的要求能夠使用push_back()
。
在原理上,一個容器支撐既T const
和在中間的一個insert()
操作將是可能的,雖然:概不要求內部存儲爲T
而非typename std::remove_const<T>::type
,同時暴露在所述接口中T&
。有必要注意const
-version ofoperations like operator[]()
,因爲當T
是某種類型時,只使用T const&
作爲返回類型S const
會導致S const const
類型。在C++ 2003中,這將是一個錯誤,在C++ 2011中,我認爲const
剛剛崩潰。爲了安全起見,您可以使用typename std::add_const<T>::type&
。
您以未定義的行爲使用標準libray。這意味着有*沒有要求*應該發生什麼。有些操作可能看起來有效,其他操作可能不會。並且在不同的實現之間沒有一致性。 –
這不能在g ++ 4.6.3上編譯。 –
你的代碼不能用C++標準編譯。 –