5

以下是不好的:

vector<const int> vec;

问题是模板类型需要是可分配的。以下代码编译 [EDIT: in Visual Studio 2010],证明了上述问题:

vector<const int> vec;
vec.push_back(6);
vec[0] += 4;

对于更复杂的类型,这可能是一个严重的问题。

我的第一个问题是这种行为是否有原因。在我看来,似乎可以制作不允许上述内容的 const 容器和允许它的非 const 容器。

其次,有没有办法让容器以这种方式发挥作用?

第三,这里实际发生了什么(使用用户类型)?我意识到这是未定义的行为,但是 STL 是如何编译的呢?

4

1 回答 1

3

不允许的原因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()。尚不清楚对T能够使用的类型有什么要求push_back()

原则上,支持两者的容器T constinsert()中间的操作是可能的,但是:没有什么需要内部存储T而不是在接口中typename std::remove_const<T>::type暴露 a T&const有必要对操作的-version有点小心,operator[]()因为仅在某些类型T const&时用作返回类型会导致类型。在 C++ 2003 中,这将是一个错误,在 C++ 2011 中,我认为它们只是崩溃了。为了安全起见,您可以使用.TS constS const constconsttypename std::add_const<T>::type&

于 2012-11-18T18:08:26.520 回答