gpt4 book ai didi

c++ - 为什么对象可以是 "moved"甚至缺少 move 构造函数和 move 赋值运算符?

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:30 32 4
gpt4 key购买 nike

http://en.cppreference.com/w/cpp/language/rule_of_three

几个月前我开始使用 c++11并观看了五人规则。

所以..我开始将复制构造函数/复制赋值运算符/move 构造函数/move 赋值运算符与 default 关键字放在每个具有虚拟析构函数的类上。

因为规则告诉我,如果您声明显式析构函数,那么您的类将不再具有隐式 move 构造函数和 move 赋值运算符。

所以我认为 gcc 会因为缺少 move 构造函数和 move 赋值运算符而向我提示下面的类。

但是效果很好!发生了什么??

class Interface {
public:
virtual ~Interface() = default; // implicit destructor
};

class ImplA : public Interface {
public:
virtual ~ImplA() = default; // implicit destructor
};

ImplA first;
ImplA second(first); // copy constructor, OK. understood it.
ImplA third(std::move(first)); // move constructor, it's OK. Why?
second = first; // copy assignment, OK. understood it.
second = std::move(first); // move assignment, it's also OK. Why?

最佳答案

So I think gcc is going to complain to me that below class due to lack of move constructor and move assignment operator.

因为可以通过复制构造函数和复制赋值运算符执行所需的操作。 Interface 仍然有复制构造函数和复制赋值运算符,它们是 implcitly declared .右值总是可以绑定(bind)到 const Interface&

更准确地说,即使没有提供 move 构造函数和 move 赋值运算符,Interface 仍然是 MoveConstructible ,

A class does not have to implement a move constructor to satisfy this type requirement: a copy constructor that takes a const T& argument can bind rvalue expressions.

MoveAssignable .

The type does not have to implement move assignment operator in order to satisfy this type requirement: a copy assignment operator that takes its parameter by value or as a const Type&, will bind to rvalue argument.


顺便说一句:如果您创建 move 构造函数和 move 赋值运算符 delete明确地那么复制和 move 操作都会失败。与右值表达式一起使用,将选择显式删除的重载,然后失败。使用左值表达式也会失败,因为复制构造函数和复制赋值运算符由于 move 构造函数或 move 赋值运算符的声明而被隐式声明为已删除。

关于c++ - 为什么对象可以是 "moved"甚至缺少 move 构造函数和 move 赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44963136/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com