我有两门课:
template<typename T>
class base{
T t;
public:
base(base &&b): t(std::move(b.t)){}
};
template<typename T, typename T2>
class derived : protected base<T>{
T2 t2;
public:
derived(derived &&d): base<T>(std::move(d)), t2(std::move(d.t2)){}
};我在derived move-constructor中移动整个base对象来初始化base部件,d变得无效,但我仍然需要它来使用它的部件进行t2初始化
做这样的事有可能吗?
发布于 2016-06-07 08:45:42
我想说的是,您的构造是正确的,除了一个小的语法错误,您需要在初始化程序列表中限定base<T>:
derived(derived &&d): base<T>(std::move(d)), t2(std::move(d.t2)){}首先,初始化顺序与初始化程序列表的顺序无关。n4296草案在12.6.2中提到初始化基地和成员class.base.init第13节
在非委托构造函数中,初始化按以下顺序进行: (13.1) -首先,而且仅对于最派生类(1.8)的构造函数,虚拟基类按照它们在基类有向无圈图的深度(首先左到右遍历)上出现的顺序进行初始化,其中“左到右”是派生类基类-说明符-列表中基类的出现顺序。(13.2)直接基类按照它们出现在基类说明符列表中的声明顺序进行初始化(不管mem初始化器的顺序如何)。(13.3)-然后,按照类定义中声明的顺序初始化非静态数据成员(同样不考虑mem初始化器的顺序)。(13.4)-最后,执行主体的复合-语句。 注意:声明顺序的任务是确保以初始化的相反顺序销毁基和子对象。-end注记
我们也有第7条或同一章规定:
每个mem初始化器执行的初始化构成一个完整表达式。mem初始化器中的任何表达式都作为执行初始化的完整表达式的一部分进行计算。
我的理解是,在derived类的move中,事情是按这个顺序发生的:
https://stackoverflow.com/questions/37668952
复制相似问题