0

有一个类Test的简单例子

#include <algorithm>
#include <iterator>
#include <vector>

template <typename T>
struct MinMax { T min, max; };

template <typename T>
using TList = std::vector<T>;

template <typename T>
class Test
{
   private:
      const T a, b;         
      const MinMax <T> m;   
   public:
      Test() : a(0), m{ 0, 0 }, b(0.0) {};
   public:
      T getA() const { return a; }
      MinMax <T> & getMinMax() const { return m; }
      T getB() const { return b; }
      Test(const Test &t) : a(t.a), b(t.b), m(t.m ) {}
};

与常量数据成员。代替构造函数,数据不会改变。我想使用 std::inserter 将测试对象的向量复制到另一个向量。我很惊讶复制构造函数是不够的

int main()
{
   TList <Test <double> > t1;
   TList <Test <double> > t2;
   Test<double> t;
   t1.push_back(t);
   std::copy(t2.begin(), t2.end(), std::inserter(t1, t1.begin()));

   return 0;
}

并出现以下编译器错误(VS2015):

Error   C2280   'Test<double> &Test<double>::operator =(const Test<double> &)': attempting to reference a deleted function  Const

是否可以让数据成员 const 并以不同的方式执行副本(一些 hack :-))?或者必须定义运算符 =,因此数据成员不能是 const (不可能分配给具有 const 数据成员的对象)?

谢谢你的帮助。

4

1 回答 1

3

对 a 的插入会vector重新分配插入元素之后的所有元素,并将插入的元素分配给已释放的插槽。

换句话说,您不能因为标准要求标准容器的元素Asssignable(已a = b定义)以提供完整的功能。

除了编写自己的明显解决方案之外,您还可以通过推回operator=将具有 const 成员的元素添加到 a :vector

std::copy(t2.begin(), t2.end(), std::back_inserter(t1));

但这有点违反标准;push_back碰巧不需要可分配性,但其他功能可能。

或者,您可以使用不需要可分配性插入的容器,例如:

template <typename T>
using TList = std::list<T>;

权衡 a 的连续内存缓存局部性的所有好处vector

最后,我倾向于避免声明我的结构的数据成员,const因为通用容器的此类问题需要在后台进行分配。请注意,在您的示例中const,从私有成员中删除会留下足够好的只读字段(只能通过外部的 getter 访问)。

于 2016-09-17T13:46:55.077 回答