C++11,常量数据成员,std::inserter,复制

标签 c++ c++11 copy-constructor assignment-operator inserter

有一个类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 将 Test 对象的 vector 复制到另一个 vector 。我很惊讶复制构造函数不够用

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数据成员的对象)?

感谢您的帮助。

最佳答案

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

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

除了编写自己的 operator= 的显而易见的解决方案之外,您还可以通过向后推向 vector 添加具有 const 成员的元素:

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

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

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

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

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

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

关于C++11,常量数据成员,std::inserter,复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39545801/

相关文章:

c++ - 在 mac 上使用 gcc 编译器编译 c++ SDL2 程序

以模板作为函数参数的 C++ 自定义比较函数

c++ - 部分专注于错误类型的非类型模板参数

c++ - 为什么 'mutable' 是 lambda 函数属性,而不是捕获类型?

c++ - 将具有 unique_ptr 的类的构造函数作为成员复制到抽象类

c++ - 从模板基类继承构造函数而不重复模板参数?

java - 默认情况下,Java 和 C++ 中的类是私有(private)的还是公有的?

c++ - 将可变参数模板传递给 pthread_create

c++ - 永恒赋值运算符调用循环C++模板类

c++ - 编译如何选择调用哪个构造函数?