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