gpt4 book ai didi

c++ - 标准容器元素的常量正确性

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:41 25 4
gpt4 key购买 nike

以下是错误的:

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>不允许的是,当插入到与开头不同的位置时, vector 中的对象可能需要重新洗牌。现在,成员(member)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++ 附带的标准库没有委托(delegate)操作,而是执行所有必要的处理,即调整数组大小并在空间不足时适当移动对象,在 push_back() 中。 .目前还不清楚对 T 类型的要求是什么能够使用 push_back() .

原则上,一个容器同时支持T const和一个 insert()不过,中间的操作是可能的:没有什么需要内部存储是 T而不是 typename std::remove_const<T>::type同时暴露 T&在界面中。有必要小心一点 const -版本操作如operator[]()因为只是使用 T const&作为 T 时的返回类型是某种类型 S const将导致类型 S const const .在 C++ 2003 中,这将是一个错误,在 C++ 2011 中,我认为 const只是崩溃了。为了安全起见,您可以使用 typename std::add_const<T>::type& .

关于c++ - 标准容器元素的常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13442497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com