Я пытаюсь понять, когда вызываются конструкторы перемещения аргументов конструктора.
Я буду использовать некоторые примеры и сценарии из реального проекта ниже, чтобы лучше проиллюстрировать мой вопрос.
Некоторое объяснениепочему я вижу результаты этих сценариев, было бы очень полезно!
//The following code is common to all examples
//This code is the place the object creation begins
std::unique_ptr<AI::Pathfinding::cDirectedWeightedGraph> graph = std::make_unique<AI::Pathfinding::cDirectedWeightedGraph>(std::move(connections));
x ------------------------------------------------------------ x
Сценарий 1:
//Here is the actual constructor for the class
cDirectedWeightedGraph(std::vector<cConnection> i_connections) : m_connections(i_connections) {}
Результат: вызывается конструктор перемещения для класса std :: vector.
x ------------------------------------------------------------ x
Сценарий 2:
//Here is the actual constructor for the class
cDirectedWeightedGraph(std::vector<cConnection>&& i_connections) : m_connections(i_connections) {}
Результат: конструктор перемещения для класса std :: vector НЕ вызывается.
x ------------------------------------------------------------ x
Сценарий 3:
//Here is the actual constructor for the class
cDirectedWeightedGraph(std::vector<cConnection>&& i_connections) : m_connections(std::move(i_connections)) {}
Результат: вызывается конструктор перемещения для класса std :: vector.
x ------------------------------------------------------------ x
Сценарий 4:
//Here is the actual constructor for the class
cDirectedWeightedGraph(std::vector<cConnection> i_connections) : m_connections(std::move(i_connections)) {}
Result: вызывается конструктор перемещения для класса std :: vector.
x ------------------------------------------------------------ x
Замечания / Вопросы для продолжения:
Кажется, не имеет значения, объявлен ли аргумент как ссылка на значение.
Кроме написания конструктора перемещения или оператора присваивания перемещения для вашего класса,Вам когда-нибудь нужно использовать ссылки rvalue в вашем конструкторе?
Я предполагаю, что в том месте, где вызывается конструктор, нет способа вызвать конструктор перемещения без передачи ссылки на rvalue(в любом случае это плохая практика, мне было просто любопытно).Я использую std :: move () для генерации rvalue ссылки.