C++ std容器元素的常量正确性

C++ std容器元素的常量正确性,c++,std,C++,Std,以下是坏消息: vector<const int> vec; vec; 问题是模板类型需要是可分配的。以下代码编译[编辑:在Visual Studio 2010中],演示了上面的问题: vector<const int> vec; vec.push_back(6); vec[0] += 4; vec; 向量推回(6); vec[0]+=4; 对于更复杂的类型,这可能是一个严重的问题 我的第一个问题是,这种行为是否有原因。在我看来,可能会生成不允许上述内容的常量容器

以下是坏消息:

vector<const int> vec;
vec;
问题是模板类型需要是可分配的。以下代码编译[编辑:在Visual Studio 2010中],演示了上面的问题:

vector<const int> vec;
vec.push_back(6);
vec[0] += 4;
vec;
向量推回(6);
vec[0]+=4;
对于更复杂的类型,这可能是一个严重的问题

我的第一个问题是,这种行为是否有原因。在我看来,可能会生成不允许上述内容的常量容器和允许上述内容的非常量容器

第二,有没有一种方法可以使容器以这种方式工作


第三,这里实际发生了什么(用户类型)?我知道这是一种未定义的行为,但STL是如何编译它的呢?

不允许使用的原因是,当插入到与开始不同的位置时,向量中的对象可能需要重新排列。现在,成员
std::vector::push_back(T const&v)
在概念上等同于(省略分配器模板参数,因为它与本讨论无关)

模板
void std::vector::push_back(T const&v){
此->插入(此->结束(),v);
}
这似乎是它在某些实现中的实现方式。现在,这个操作通常需要移动一些对象,因此,
T
参数需要是可赋值的。MSVC++附带的标准库似乎没有委托操作,而是在
push_back()
中执行所有必要的处理,即调整数组大小,并在空间不足时适当移动对象。对于能够使用
push_back()
的类型
t
的要求,还不太清楚


原则上,一个容器同时支持<>代码> T const 和一个<>代码>插入()//>操作在中间是可能的,但是:没有任何东西要求内部存储是<代码> t>代码>而不是<代码>类型名STD::Revivyconst::类型< /代码>,同时在接口中公开<代码> T和<代码>。有必要对

const
类操作的
const
版本有点谨慎,因为当
T
是某种类型
S const
时,仅使用
T const&
作为返回类型将导致类型
S const
。在C++ 2003中,这将是一个错误,在C++ 2011中,我认为<>代码> const 只是崩溃了。为了安全起见,您可以使用
typename std::add_const::type&

您正在以一种未定义行为的方式使用标准库。这意味着对应该发生的事情没有任何要求。有些操作似乎有效,有些则可能无效。在不同的实现之间没有一致性。这在G+4.4.3上没有编译。你的代码没有用C++标准编译。Visual Studio 2010编译它。嗯,我的猜测是,不值得费心去正确定义它应该如何为标准工作,因为你并不经常需要这样的行为。
template <typename T>
void std::vector<T>::push_back(T const& v) {
    this->insert(this->end(), v);
}