【问题标题】:The move sum operator with unique_ptr具有 unique_ptr 的移动和运算符
【发布时间】:2020-02-15 10:28:02
【问题描述】:

对我来说理解指针管理的机制有点复杂。

我尝试通过这种方法减少对班级成员的复制操作:

#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 是 (1) 值 b 是 (3) 值 res 是 (4) 析构函数形状 析构函数形状 析构函数形状

将复制构造函数和复制操作符 = 标记为“已删除”是否是个好主意,或者我可以删除这些行? std::move 运算符一个人有多贵?

【问题讨论】:

  • 删除拷贝构造函数和拷贝赋值运算符的目的是什么?
  • std::move 本身什么都不做——它只是一个演员表,不花任何钱。

标签: c++ copy move operator-keyword


【解决方案1】:

将复制构造函数和复制操作符 = 标记为“已删除”是否是个好主意,或者我可以删除这些行?

您可以删除复制构造函数和复制运算符行的删除:

https://en.cppreference.com/w/cpp/language/copy_constructor in 已删除隐式声明的复制构造函数

如果满足以下任一条件,则将类 T 的隐式声明或默认复制构造函数定义为已删除:

  • ...
  • T 有一个用户定义的移动构造函数或移动赋值运算符(这种情况只会导致隐式声明的复制构造函数被删除,而不是默认的复制构造函数被删除)。

std::move 操作符一个人有多贵?

std::move 用于将值转换为 xvalue(eXpiring 值)。它没有成本(它是在编译时强制转换的),其含义是一旦你在一个对象上调用了 std::move ,你就不应该在之后使用它。例如,在您的代码中,a+b 被隐式转换为 xvalue

您可以在此处找到有关 xvalue 的更多信息:https://en.cppreference.com/w/cpp/language/value_category

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多