Я хочу знать, что здесь происходит:конструктор копирования не вызывается при возврате зЬй :: вектор
class Test {
public:
Test() { std::cout << "Constructor" << std::endl; }
Test(const Test &) { std::cout << "Copy" << std::endl; }
Test(const Test &&) { std::cout << "Move" << std::endl; }
~Test() { std::cout << "Destructor" << std::endl; }
};
std::vector<Test> getTestVektor() {
std::vector<Test> TestVektor(1);
return TestVektor;
}
Test getTest() {
Test TestVariable;
return TestVariable;
}
int main() {
{
std::vector<Test> TestVektor = getTestVektor();
}
std::cout << std::endl;
{
Test TestVarible = getTest();
}
std::cout << std::endl;
{
std::vector<Test> TestVektor(1);
std::vector<Test> TestVektor2 = TestVektor;
}
return 0;
}
скомпилирован с VisualStudio 2012:
Constructor
Destructor
Constructor
Move
Destructor
Destructor
Constructor
Copy
Destructor
Destructor
Можно было бы объяснить первый случай с копией элизии , Но это противоречит второму случаю, когда был вызван конструктор перемещения.
Другим объяснением было бы то, что std :: vector в функции освобождает его содержимое и передает его второму std :: vector, поэтому вызов конструктора копирования отсутствует. Но третий случай показывает, что это не так.
Итак, что здесь происходит? Или это просто мази компилятор opitimization?
Знакомый с «Именованная оптимизация возвращаемого значения»?(Я согласен, что он должен применяться и в случае № 2) –
Где ваши операторы присваивания копий/перемещений? – xaxxon
@BenVoigt Да. Видимо, конструктор перемещения вектора является важным моментом ... – Corylus