加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – std容器元素的Const-Correctness

发布时间:2020-12-16 05:02:22 所属栏目:百科 来源:网络整理
导读:以下是坏事: vectorconst int vec; 问题是模板类型需要可分配.以下代码编译[编辑:在Visual Studio 2010中],演示上述问题: vectorconst int vec;vec.push_back(6);vec[0] += 4; 对于更复杂的类型,这可能是一个严重的问题. 我的第一个问题是这种行为是否有
以下是坏事:
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)在概念上等同于(保留分配器模板参数,因为它与此讨论无关)
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& T时,没有任何东西要求内部存储器是T而不是typename std :: remove_const< T> :: type.在界面中.有必要对像operator []()这样的常量操作有点小心,因为只使用T const&作为返回类型,当T是某种类型时,S const将导致类型S const const.在C 2003中,这将是一个错误,在C 2011中,我认为const刚刚崩溃.为了安全起见,您可以使用typename std :: add_const< T> :: type&.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读