C++11,常量数据成员,std::inserter,复制
C++11, const data members, std::inserter, copy
有一个class测试的简单例子
#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数据成员的对象)?
感谢您的帮助。
对 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
,因为通用容器在幕后需要可分配性,因此存在此类问题。请注意,在您的示例中,从私有成员中删除 const
会给您留下足够好的只读字段(只能通过外部的 getter 访问)。
有一个class测试的简单例子
#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数据成员的对象)?
感谢您的帮助。
对 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
,因为通用容器在幕后需要可分配性,因此存在此类问题。请注意,在您的示例中,从私有成员中删除 const
会给您留下足够好的只读字段(只能通过外部的 getter 访问)。