я следующий код:C++ что происходит, когда функция возвращает вектор <shared_ptr<>>?
#include <iostream>
#include <memory>
#include <vector>
class Test
{
public:
Test() {}
~Test() { std::cerr << "Delete\n"; }
};
std::vector<std::shared_ptr<Test>> makeList()
{
std::vector<std::shared_ptr<Test>> list;
list.push_back(std::make_shared<Test>(Test()));
return std::move(list);
}
int main(int argc ,char **argv)
{
std::vector<std::shared_ptr<Test>> list;
std::cerr << "Before\n";
list = makeList();
std::cerr << "After\n";
return 0;
}
Что я компилирую с:
clang++ -std=c++14 -o ptr ptr.cpp
Выход есть:
Before
Delete
After
Delete
Мой вопрос: почему есть объект удаляется в функция makeList
? Мое предположение заключалось в том, что list
от функции будет перемещен в list
от main
и что, следовательно, ни один объект не будет удален/воссоздан в процессе?
Можно ли этого избежать (как очевидно, этот код не является оптимальным)?
Создайте временный объект 'Test' с помощью' Test() '. Затем копия этого делается с помощью 'make_shared', затем временное уничтожается. Вероятно, вам понадобится 'std :: make_shared()' –
'return std :: move (list);' должен быть 'return list; 'по соображениям эффективности. –
^^ Это. OP: Если ваш компилятор не предупреждает вас об этом, возможно, пора получить лучший компилятор (или включить предупреждения).Функция std :: move() здесь запрещает оптимизацию возвращаемого значения. Последние версии clang могут предупредить вас об этом. – marko