#include <vector>
#include <iostream>
using namespace std;
struct foo
{
//constructor 1
foo() { std::cout << "foo()" << endl; }
~foo() { std::cout << "~foo()" << endl; }
//constructor 2
foo(const foo&) { std::cout << "foo(const foo&)" << endl; }
//constructor 3
foo(foo&) { std::cout << "foo(foo&)" << endl; }
//constructor 4
foo(foo&&) { std::cout << "foo(foo&&)" << endl; }
};
int main()
{
std::vector<foo> v;
foo f0; // constructor 1 is be called
v.push_back(f0); // constructor 2 is be called
foo f1 = f0; // constructor 3 is be called
cout << "-Action-4-" << endl;
v.push_back(foo{}); // constructor 1,4,2 is called and 2 Desctrunctors
cout << "Destructors will be called" << endl;
return 0;
}
Вывод кода
Приведенный выше фрагмент кода трижды вызывает конструктор для действия 4. Может кто-нибудь объяснить, почему?
1) для foo f0;
конструктор 1 (конструктор по умолчанию) вызывается
2) для v.push_back(f0);
конструктор 2 вызывается потому что push_back
перегружен для const foo&
3) foo f1 = f0;
конструктор 3 вызывается потому чтооператора присваивания предпочитают ссылку Lvalue foo&
4) v.push_back(foo{});
вызывается конструктор 1,4,2 и 2 деструктора. Пожалуйста, объясните это поведение.
Изменение кода как std :: vector v;v.reserve (10);сделал свое дело, теперь действие 4 вызывает конструктор 1,4 и 1 деструкторы