c++ - Move constructor for derived class -


i have 2 classes:

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)){} }; 

i move entire d object in derived move-constructor initialize base part , d becomes invalid still need use it's part t2 initialization

is possible such thing?

i construct correct except little syntax error, need qualify base<t> in initializer list:

derived(derived &&d): base<t>(std::move(d)), t2(std::move(d.t2)){} 

first, order of initialization independant of order of initializer list. draft n4296 says in 12.6.2 initializing bases , members [class.base.init] § 13

in non-delegating constructor, initialization proceeds in following order:
(13.1) — first, , constructor of derived class (1.8), virtual base classes initialized in order appear on depth-first left-to-right traversal of directed acyclic graph of base classes, “left-to-right” order of appearance of base classes in derived class base-specifier-list.
(13.2) — then, direct base classes initialized in declaration order appear in base-specifier-list (regardless of order of mem-initializers).
(13.3) — then, non-static data members initialized in order declared in class definition (again regardless of order of mem-initializers).
(13.4) — finally, compound-statement of constructor body executed.

[ note: declaration order mandated ensure base , member subobjects destroyed in reverse order of initialization. —end note ]

we have §7 or same chapter says:

the initialization performed each mem-initializer constitutes full-expression. expression in mem-initializer evaluated part of full-expression performs initialization.

my understanding standard says in move ctor derived class, things happens in order:

  • move ctor base class called
    • in turn calls move ctor t constructing t member of target , zeroing t member of source
  • move ctor t2 object called - @ moment, end of full expression has not been reached, , t member of source has been destroyed
  • at end of full statement, source object left in undetermined state , should no longer used.