[英]Const-Correctness for Elements of std Containers
以下是壞事:
vector<const int> vec;
問題是模板類型需要可分配。 以下代碼編譯[編輯:在Visual Studio 2010中],演示上述問題:
vector<const int> vec;
vec.push_back(6);
vec[0] += 4;
對於更復雜的類型,這可能是一個嚴重的問題。
我的第一個問題是這種行為是否有原因。 在我看來,有可能使const容器不允許上面和非const容器允許它。
第二,有沒有辦法讓容器以這種方式運行?
第三,這里實際發生了什么(用戶類型)? 我意識到它是未定義的行為,但STL甚至如何編譯呢?
不允許使用std::vector<T const>
的原因是當插入到與開頭不同的位置時,向量中的對象可能需要重新洗牌。 現在,成員std::vector<T>::push_back(T const& v)
在概念上等效於(將allocator模板參數保留為out,因為它與此討論無關)
template <typename T>
void std::vector<T>::push_back(T const& v) {
this->insert(this->end(), v);
}
這似乎是它在某些實現中的實現方式。 現在,這個操作通常需要移動一些對象,因此T
參數需要是可分配的。 似乎帶有MSVC ++的標准庫不會委托操作,而是在push_back()
執行所有必要的處理,即調整數組大小並在空間不足時適當地移動對象。 對於能夠使用push_back()
的類型T
的要求是什么並不十分清楚。
原則上,可以在中間支持T const
和insert()
操作的容器,但是:在暴露T&
in時,沒有任何內容存儲需要T
而不是typename std::remove_const<T>::type
界面。 有必要對諸如operator[]()
類的operator[]()
的const
變換有點小心,因為當T
是某種類型時,只使用T const&
作為返回類型S const
將導致類型S const const
。 在C ++ 2003中,這將是一個錯誤,在C ++ 2011中,我認為const
只是崩潰了。 為了安全起見,您可以使用typename std::add_const<T>::type&
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.