http://definedbehavior.blogspot.tw/2011/08/value-semantics-copy-elision.html

 

class Mars
{
private:
    int inum ;
public:
    Mars(int inum_=0):inum(inum_)
    {
        cout << "default " << endl ;
    }
    Mars(const Mars& m)
    {
        cout << "copy cons" << endl ;
        inum = m.getnum();
    }
    Mars(Mars&& m)
    {
        cout << "move cons" << endl ;
        inum = m.getnum();
    }
    Mars& operator=(const Mars& m)
    {
        cout << "copy assign" << endl ;
        inum = m.getnum(); return *this;
    }
    Mars& operator=(Mars&& m)
    {
        cout << "move assign" << endl ;
        inum = m.getnum(); return *this;
    }
    ~Mars(){}
    int getnum() const { return inum; }
    void Print() const { cout << inum << endl; }
} ;

Mars f(int ix)
{
    Mars m(ix) ;
    return m ;
}

Mars g(Mars x)
{
    return x ;
}

int main()
{
    const Mars& m = f(99) ;
    m.Print() ;

    Mars x = f(999) ;
    x.Print() ;

    Mars xx = g( f(123) ) ;
    xx.Print() ;
}

output :

default
99
default
999
default
copy cons
123

注意 ,  最後一個  g( f(123) )  compile 不會採取 copy elision , 雖然看起來應該可以 ....!!

 

 

arrow
arrow
    全站熱搜

    hedgezzz 發表在 痞客邦 留言(0) 人氣()