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.