Статический объект структуры создан, в то время как vector.push_back (foo {}) трижды вызывает конструктор - PullRequest
0 голосов
/ 11 сентября 2018
#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 деструкторы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...