2015-02-26 3 views
1

Вот мой исходный код:Почему конструктор/деструктор называется один раз?

#include <iostream> 
#include <memory> 
#include <vector> 

using namespace std; 

class Copy { 
public: 

    Copy() { 
     cout << "Constructor called" << endl; 
    }; 

    Copy(const Copy& copy) { 
     cout << "Copy constructor called" << endl; 
    } 

    Copy& operator=(Copy copy) { 
     cout << "Copy-Assign constructor called" << endl; 
     return *this; 
    } 

    Copy(Copy &&copy) noexcept { 
     cout << "Move constructor called" << endl; 
    } 

    Copy& operator=(Copy &&copy) noexcept { 
     cout << "Move-Assign constructor called" << endl; 
     return *this; 
    } 

    ~Copy() { 
     cout << "Destructor called" << endl; 
    } 
}; 

Copy TestCopy() { 
    Copy cop; 
    return cop; 
} 

vector<Copy> TestCopyVector() { 
    vector<Copy> copyVector = vector<Copy>{Copy()}; 
    return copyVector; 
} 

int main() 
{ 
    Copy cop = TestCopy(); 
    //TestCopy(); 
    //vector<Copy> copyVector = TestCopyVector(); 

    return 0; 
} 

В моем понимании линия

Copy cop = TestCopy(); 

должен вызвать перемещение-назначение Копировать. В то время как выход похож на нижний:

$ ./test 
Constructor called 
Destructor called 

Не могли бы вы помочь объяснить это? Благодарю.

+1

Копирование/перемещение эликсира. –

+1

'Копировать cop = TestCopy();' никогда не будет вызывать назначение перемещения в любом случае - в этой строке нет назначения. В отсутствие elision он будет вызывать конструктор перемещения. –

ответ

1

Это называется RVO (Return value optimization), и это хорошо известная оптимизация, которую компилятор разрешает делать в подобных ситуациях.