I have some doubts about construction and initialization order guarantees in C++. For instance, the following code has four classes X
, Y
, Z
and W
. The main function instantiates an object of class X
, which contains an object of class Y
, and derives from class Z
, so both constructors will be called. Additionally, the const char*
parameter passed to X
's constructor will be implicitly converted to an object of class W
, so W
's constructor must also be called.
What are the guarantees the C++ standard gives on the order of the calls to the copy constructors? Or, equivalently, what this program is allowed to print?
#include <iostream>
class Z {
public:
Z() { std::cout << "Z" << std::endl; }
};
class Y {
public:
Y() { std::cout << "Y" << std::endl; }
};
class W {
public:
W(const char*) { std::cout << "W" << std::endl; }
};
class X : public Z {
public:
X(const W&) { std::cout << "X" << std::endl; }
private:
Y y;
};
int main(int, char*[]) {
X x("x");
return 0;
}
edit: Is this correct?
W |
/ \ |
Z Y |
\ / |
X V