Когда мы создаем объект и присваиваем его переменной, а затем хотим добавить его в некоторый контейнер, скажем, std::vector
, происходят две вещи:
- , конструктор вызывается для созданияобъект ранее
- конструктор копирования вызывается при выполнении
push_back
Когда нам больше не нужен объект, мы можем использовать std::move
, чтобы ускорить процесс,Допустим, у меня есть такой код:
#include <vector>
#include <cstdio>
#include <memory>
class foo
{
public:
int x;
foo() {}
foo(int bar) : x(bar) {}
};
int main()
{
std::vector<std::shared_ptr<foo>> foos;
auto n = std::make_shared<foo>(42);
foos.push_back(std::move(n));
}
Но что, если я не определил переменную?Что, если я только что сделал:
foos.push_back(std::make_shared<foo>(42));
Тогда вызывается конструктор копирования?Должен ли я использовать std::move
?(как foos.push_back(std::move(std::make_shared<foo>(42)));
) Я попытался проверить это в godbolt.org , но я не вижу ничего в беспорядке ассемблера.Итак, вызывается ли конструктор копирования (поэтому я бы использовал std::move
, чтобы устранить это) или нет, и я должен оставить его так: foos.push_back(std::make_shared<foo>(42));
?