簡體   English   中英

std容器元素的正確性

[英]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 constinsert()操作的容器,但是:在暴露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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM