繁体   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