Оператор суммы хода с unique_ptr - PullRequest
0 голосов
/ 15 февраля 2020

Мне немного сложно понять механизм c управления указателями.

Я пытаюсь сократить операции копирования с членами класса с помощью этого приложения:

#include <iostream>
#include <vector>

class Shape {

public:

    std::unique_ptr<int> x;

    Shape(const Shape& val) = delete; // will be delete by default by compiler?

    Shape& operator=(const Shape& val) = delete; // will be delete by default by compiler?

    Shape(Shape&& val) noexcept {
        this->x = std::move(val.x);
    }

    Shape& operator=(Shape&& val) noexcept {
        std::cout << "Move operator=" << std::endl;
        this->x = std::move(val.x);
        return *this;
    }

    Shape() : x(std::unique_ptr<int>(new int)) {
        std::cout << "Constructor Shape" << std::endl;
    }

    Shape(int v) : x(std::unique_ptr<int>(new int(v))) {
        std::cout << "Constructor Shape (by value)" << std::endl;
    }

    virtual ~Shape() {
        std::cout << "Destructor Shape" << std::endl;
    };

    Shape operator+(const Shape& val) {

        std::cout << "Move sum" << std::endl;
        Shape res(*x + *val.x);
        return res;
    }
};

int main()
{

    Shape a(1);
    Shape b(3);

    Shape res = a + b;

    std::cout << "Value a is (" << *(a.x) << ")" << std::endl;
    std::cout << "Value b is (" << *(b.x) << ")" << std::endl;
    std::cout << "Value res is (" << *(res.x) << ")" << std::endl;

};

результат:

Форма конструктора (по значению) Форма конструктора (по значению) Сумма перемещений Форма конструктора (по значению) Форма деструктора Значение a is (1) Значение b is (3) Значение res is (4) Деструктор Shape Destructor Shape Destructor Shape

Хорошая идея пометить конструктор копирования и оператор копирования = как "удаленные", или я могу удалить эти строки? Насколько дорог сам оператор std :: move?

1 Ответ

0 голосов
/ 15 февраля 2020

Хорошая идея пометить конструктор копирования и оператор копирования = как "удаленные", или я могу удалить эти строки?

Вы можете удалить свои удаления конструктора копирования и скопировать строки оператора:

https://en.cppreference.com/w/cpp/language/copy_constructor in Удаленный неявно объявленный конструктор копирования

Неявно объявленный или дефолтный конструктор копирования для класса T определяется как удаленный, если выполняется любое из следующих условий:

  • ...
  • T имеет пользовательский конструктор перемещения или оператор присваивания перемещения (это условие вызывает только неявно объявленный, а не дефолтный конструктор копирования, который будет удален).

Сколько стоит сам оператор std :: move?

std :: move используется для приведения значения к xvalue (eXpiring ценность). Он не требует затрат (он приводится во время компиляции), и это означает, что после того, как вы вызвали std :: move для объекта, вы не должны использовать его после. Например, в вашем коде a+b неявно приводится к xvalue

Более подробную информацию о xvalues ​​можно найти здесь: https://en.cppreference.com/w/cpp/language/value_category

...