如何push_back没有operator =()为const成员? [英] How to push_back without operator=() for const members?

查看:291
本文介绍了如何push_back没有operator =()为const成员?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何push_back()到C ++ std :: vector而不使用operator =(),默认定义违反了const成员?

How to push_back() to a C++ std::vector without using operator=() for which the default definition violates having const members?

struct Item {
  Item(int value)
    : _value(value) {
  }
  const char _value;
}

vector<Item> items;

items.push_back(Item(3));

我想保留_value常量,因为在构造对象后它不应该更改,问题是如何用元素初始化我的向量而不调用operator =()?

I'd like to keep the _value const since it should not change after the object is constructed, so the question is how do I initialize my vector with elements without invoking operator=()?

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

Here is the basic error the g++ v3.4.6 is giving me:

.../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


推荐答案

$ c> std :: vector< T> 元素必须是可分配的。您键入的内容不可分配。一个实现。 std :: vector< T> 可以避免坚持这一要求,但这将是一种损失,因为结果代码将不可移植。

For std::vector<T> the elements are required to be Assignable. You type is not Assignable. An implementation of. std::vector<T> could avoid insisting on this requirement but this would be a disservice as the resulting code wouldn't be portable.

您可以改用 std :: list< T> 或更改您的类型定义。例如,您可以创建一个只读取值但没有设置器的访问器。当然,赋值会改变这个值。因此,选择是允许这种改变或允许将对象放入容器中。你不会得到这两个。

You can use a std::list<T> instead or change the definition of you type. For example you can create an accessor to only read the value but no setter. Of course, assignment would change the value. The choice thus is to either allow this change or allow putting the objects into a container. You won't get both.

这篇关于如何push_back没有operator =()为const成员?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆