如何为const成员在没有运算符=()的情况下进行push_back

How to push_back without operator=() for const members?

本文关键字:情况下 back push const 成员 运算符      更新时间:2023-10-16

如何在不使用运算符=()的情况下将_back()推送到C++std::向量,因为默认定义违反了具有const成员的规定?

struct Item {
  Item(int value)
    : _value(value) {
  }
  const char _value;
}
vector<Item> items;
items.push_back(Item(3));

我想保持_value常量,因为它在构建对象后不应该改变,所以问题是如何在不调用运算符=()的情况下用元素初始化向量?

这是g++v3.4.6给我的基本错误:

.../3.4.6/bits/vector.tcc: In member function `Item& Item::operator=(const Item&)':
.../3.4.6/bits/vector.tcc:238:   instantiated from `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = Item, _Alloc = std::allocator<Item>]'
.../3.4.6/bits/stl_vector.h:564:   instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Item, _Alloc = std::allocator<Item>]'
item.cpp:170:   instantiated from here
.../3.4.6/bits/vector.tcc:238: error: non-static const member `const char Item::_value', can't use default assignment operator

对于std::vector<T>,元素必须是可分配的。您键入的是不可分配的。的实现。std::vector<T>可以避免坚持这个要求,但这将是一种伤害,因为生成的代码不可移植。

您可以使用std::list<T>,也可以更改您键入的定义。例如,您可以创建一个只读取值而不读取setter的访问器。当然,赋值会改变值。因此,选择要么允许此更改,要么允许将对象放入容器中。你不会两全其美。