Home > Mobile >  c missing construction and destruction of an object
c missing construction and destruction of an object

Time:05-22

The following code:

#include <iostream> 
#include <string>
using namespace std;
void print(string a) { cout << a << endl; }
void print(string a, string b) { cout << a << b << endl; }
 
class A {
    public:
    string p;
    A() { print("default constructor"); }   
    A(string a){ p = a; print("string constructor ", p); }
    A(const A& o) { print("copy constructor"); }
    A (A&& o) { print("move constructor"); }
    A& operator=(const A& o) { print("copy assignment"); return *this; }
    A& operator=(const A&& o) { cout << "move assignment to:" << p << " from:" << o.p << endl; return *this; }
    ~A() { print("destructor ", p); }
};

A operator (const A& a, const A& b) { 
    cout << "add" <<endl; 
    A c("f"); 
    return c;
}
    
A f(A& a, A& b, A& c) {
    A d("e");
    d = a b c;
    print("after add");
    return d;
}

int main() {
    A a("a"); A b("b"); A c("c");
    A whereDidThisGo {f(a,b,c)};
    print("end");
}

has the following output:

string constructor a
string constructor b
string constructor c
string constructor e
add
string constructor f
add
string constructor f
move assignment to:e from:f
destructor f
destructor f
after add
end
destructor e
destructor c
destructor b
destructor a

Process exited after 0.06744 seconds with return value 0
Press any key to continue . . .

Where is the construction/destruction of the whereDidThisGo variable defined in main?

CodePudding user response:

Where is the construction/destruction of the whereDidThisGo variable defined in main?

You do not see the ouptut for this due to named return value optimization(aka NRVO).

it's not a good optimization for people like me who are trying to learn constructors

You can disable this NRVO by providing the -fno-elide-constructors flag to the compiler. Demo.


Also, note that in your example the A::operator=(const A&&) should instead be:

//-----------vv------->no need for const  here
A::operator=(A&&)

CodePudding user response:

TIL about NRVO, it's not a good optimization for people like me who are trying to learn constructors haha.

Thank you for the answers, yes the move assignment should be a non-const pointer, I simply overlooked it.

  • Related