У меня есть класс B
, который содержит вектор класса A
. Я хочу инициализировать этот вектор через конструктор. Класс A
выводит некоторую информацию об отладке, чтобы я мог видеть, когда он создан, уничтожен, скопирован или перемещен.
#include <vector>
#include <iostream>
using namespace std;
class A {
public:
A() { cout << "A::A" << endl; }
~A() { cout << "A::~A" << endl; }
A(const A& t) { cout <<"A::A(A&)" << endl; }
A(A&& t) { cout << "A::A(A&&)" << endl; }
};
class B {
public:
vector<A> va;
B(const vector<A>& va) : va(va) {};
};
int main(void) {
B b({ A() });
return 0;
}
Теперь, когда я запускаю эту программу (скомпилирован с опцией GCC -fno-elide-constructors
, поэтому вызовы конструктора перемещения не оптимизированы), я получаю следующий вывод:
A::A
A::A(A&&)
A::A(A&&)
A::A(A&)
A::A(A&)
A::~A
A::~A
A::~A
A::~A
A::~A
Поэтому вместо одного экземпляра A
компилятор генерирует пять экземпляров. A
перемещается два раза и копируется два раза. Я этого не ожидал. Вектор передается ссылкой на конструктор и затем копируется в поле класса. Поэтому я ожидал бы одну операцию копирования или даже операцию перемещения (потому что я надеялся, что вектор, который я передаю конструктору, - это просто rvalue), а не две копии и два хода. Может кто-нибудь объяснить, что именно происходит в этом коде? Где и почему он создает все эти копии A
?