I have the following simple c++ code :
class X {
    public :
    int x ;
    X(int val) : x(val) {cout<<"one arg\n" ;} 
    X(const X&xx) {cout<<"const copy constr\n" ; x = xx.x ;}
    X(X&xx) {cout<<"non const copy constr\n" ; x = xx.x ;}
    X(const X&&xx) {cout<<"const move constr\n" ; x = xx.x ;}
    X(X&&xx) {cout<<"non const move constr\n" ; x = xx.x ;}
    X operator +(X &ob) {
        X xx(x+ob.x) ; cout<<"add\n" ; return xx ;
    }
    X operator=(const X &x) {cout<<"const assign\n" ;}
    X operator=(X &x) {cout<<"non const assign\n" ;}
    X operator=(const X &&x) {cout<<"const move assign\n" ;}
    X operator=(X &&x) {cout<<"non const move assign\n" ;}
} ;
main() {
    X   x1(10), x2(x1) ;
    cout<<"$$$$$$$$$$$$$$\n" ;
    X   x3 = x1+x2 ;//does not invoke move/copy constr ---> do not know why
    cout<<"###########"<<x3.x<<endl ;
    cout<<"$$$$$$$$$$$$$$\n" ;
    vector<X>   v ;
    v.push_back(X(100)) ;//invokes move constr
}
Via which constructor is the object x3 created ?
 
    