Знакомство с семантикой копирования в С++

Пожалуйста, рассмотрите этот код:

class A
{

};

int main()
{
    std::vector<A> test;
    test.push_back(A());
}

Конструктор и деструктор будут вызываться дважды, также память будет выделена дважды, и объект будет скопирован, теперь это не только потенциально вредно для производительности, но также может привести к ошибкам во время выполнения, особенно если там происходит очистка деструктор. То, как я обычно обошел это, - это просто создать вектор указателей:

std::vector<A*> test;
test.push_back(new A());

Мой вопрос в два раза, это обычная практика, и это хорошая практика? Или есть лучший способ? Если это окажется обманом, пожалуйста, дайте мне знать, и я закрою вопрос, но я не нашел ничего в поиске.

Ответ 1

Используйте emplace_back.

std::vector<A> test;
test.emplace_back();
//test.emplace_back(constructor, parameters);

Таким образом, A будет построен на месте, поэтому копия или перемещение не произойдет.

Изменить: уточнить комментарии к вопросу - Нет, это не изменится с push_back, если вы передадите ему временное. Например,

test.emplace_back(A{});

Будет, в С++ 11, создать временный A, переместить и уничтожить, как если бы вы использовали push_back.