Описание тега move-semantics

Move semantics is a programming language feature that allows a copy operation to be replaced by a more efficient "move" when the source object is a temporary or an otherwise expiring object.
3 ответа

Почему этот boost::asio::tcp::socket можно использовать повторно?

Ниже приведен код из примера boost::asio. Почему это нормально, чтобы переместить socket_ член при построении chat_session если рекурсивный вызов в нижней части обработчика собирается передать это же tcp::socket в следующий раз, когда произойдет сог…
31 июл '18 в 16:13
1 ответ

Cppcheck знает о семантике перемещения?

Я пишу класс, который более или менее выглядит так struct Foo { std::shared_ptr<Bar> bar_ptr; Foo(std::shared_ptr<Bar> b) : bar_ptr(std::move(b)) {} }; и cppcheck предупреждает (производительность) Параметр функции 'b' должен быть переда…
06 фев '18 в 01:26
1 ответ

Правильно ли я использую семантику перемещения? Какая будет выгода?

Интересно, если я использую move семантически правильно: class Vertex{ protected: Common::Point3D position; Common::Point3D normal; Common::Point2D uv; Common::Point2D tangent; public: Vertex(Common::Point3D &&position, Common::Point3D &…
18 май '15 в 21:41
3 ответа

Почему конструктор перемещения / оператор присваивания в C++11 не работает должным образом?

#include <iostream> using namespace std; struct A { A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } A(A&&) { cout << "A(A&&)" << endl; } A& operator =(A&&) { cout …
1 ответ

В чем преимущество использования конструктора перемещения по сравнению с передачей указателя?

Foo(Foo&& other) { this->bar = other.bar; other.bar = nullptr; } Foo(Foo* other) { this->bar = other->bar; other->bar = nullptr; } Вышеупомянутые два, кажется, делают то же самое. Так почему рекомендуется использовать конструктор…
28 янв '17 в 01:42
3 ответа

Назначение перемещения несовместимо со стандартным копированием и обменом

Тестирование новой семантики Move. Я только что спросил о проблемах, которые у меня были с конструктором Move. Но, как выясняется в комментариях, проблема в том, что оператор "Назначение перемещения" и оператор "Стандартное назначение" конфликтуют п…
07 ноя '13 в 16:41
1 ответ

Почему в сопоставлении с образцом кортежа Rust требуется явное заимствование?

Я пишу бинарное дерево на Rust, и проверка заимствований действительно смущает меня. Вот минимальный пример, который воспроизводит проблему. Двоичное дерево определяется следующим образом: struct NonEmptyNode; pub struct BinaryTree { root: Option&lt…
10 май '18 в 03:42
3 ответа

Все ли реализации std::move(), основанные на std::swap(), содержат ошибки?

Возможный дубликат: Что я могу сделать с перемещенным объектом? Например, посмотрите этот код: template<class T> void swap(T& a, T& b) { T tmp(std::move(a)); a = std::move(b); b = std::move(tmp); } Это только у меня, или здесь есть оши…
27 июл '12 в 16:01
5 ответов

Является ли конструкция "передача по значению и перемещению" плохой идиомой?

Так как у нас есть семантика перемещения в C++, в настоящее время это обычно делается void set_a(A a) { _a = std::move(a); } Причина в том, что если a является значением, копия будет удалена, и будет только один ход. Но что произойдет, если a такое …
10 янв '14 в 02:56
3 ответа

Конструктор перемещения: как обрабатывать атрибут контейнера?

Как правильно инициализировать атрибут контейнера, избегая реконструкции содержащихся объектов? class BAR { ... }; class FOO { public: FOO(FOO &&f) { // ???? } std::vector<BAR> b; };
20 май '13 в 12:11
0 ответов

push_back PR-значение в векторе

Внимательно читая ссылки, конструктор перемещения может быть вызван только Xvalue. Тогда как-то так... std::vector<Class> vec vec.push_back(Class(..args..)) возможно без перемещения (приведения) к Xvalue? Есть ли конкретный способ использовани…
1 ответ

Почему std::weak_ptr не имеет конструктора перемещения или оператора присваивания перемещения?

Просматривая 1,53 заголовка boost для weak_ptr, я был удивлен, увидев, что назначение перемещения и конструкторы перемещения были реализованы, даже если они не были задокументированы. Из этой документации нет никаких требований к std::weak_ptr для о…
1 ответ

Компилятор не использует Move C'or / назначение операции?

Простой вопрос на самом деле. Что происходит в следующем примере кода, который приводит к тому, что он не компилируется? Ошибка возникает в первой строке main(): "Использование удаленной функции"std::__atomic0::...__atomic_base(...)")" #include <…
19 мар '15 в 17:59
1 ответ

Почему конструктор копирования вызывается, когда я возвращаю выделенный объект кучи, но не для выделенного объекта стека?

У меня есть state класс, который имеет задание на перемещение / конструктор. Копирование / конструктор установлены на delete, Я запутался, почему в следующей функции (которая возвращает state object) компилируется и работает так: state propagator::P…
07 ноя '18 в 09:35
2 ответа

std::move или std::forward при назначении универсального конструктора переменной-члену в C++

Рассмотрим следующие классы foo1 а также foo2 template <typename T> struct foo1 { T t_; foo1(T&& t) : t_{ std::move(t) } { } }; template <typename T> struct foo2 { foo1<T> t_; foo2(T&& t) : t_{ std::forward<T>…
1 ответ

C++ использование удаленной функции с unique_ptr, make_unique

Псевдокласс, выполняющий матричное дополнение, использующее std::unique_ptr в качестве члена данных для представления элементов. М-рядов, N столбцов. Класс настроен для типа M, N. Я пытаюсь выполнить сложение матрицы (C = A+B) и продолжаю получать э…
11 авг '18 в 20:58
1 ответ

C++ std::deque copy конструктор проблема

#include <deque> #include <vector> struct A { A(int* const p) : m_P(p) {} A(A&& rhs) : m_P(rhs.m_P) { rhs.m_P = nullptr; } A& operator=(A&& rhs) { delete m_P; m_P = rhs.m_P; rhs.m_P = nullptr; } ~A() { delete m_P; } A…
12 авг '16 в 07:30
1 ответ

Как преобразовать lvalue в rvalue? А что происходит с новым значением?

Я хотел бы переместить объект в std::vector с помощью std::vector::push_back(), Казалось бы, это возможно, так как есть std::vector::push_back(value_type&& val) функция. Но из-за существования std::vector::push_back(value_type const & va…
19 май '13 в 17:35
1 ответ

Делаем POD классы подвижными

У меня есть класс POD, и я хочу сделать его подвижным для эффективности. Я храню все данные в std::array объект-член, и я делаю мои публичные переменные-члены ссылки на части этого std::array объект. Сделав это, теперь я могу переместить все данные,…
22 дек '15 в 09:53
1 ответ

Оператор копирования, определенный в шаблоне, удаляемом компилятором

Я знаком с принципом (например, из этого и этого ответа), что когда класс имеет конструктор перемещения и / или оператор присваивания перемещения, его конструктор копирования по умолчанию и оператор назначения копирования удаляются. Тем не менее, в …
11 авг '14 в 15:10