所以,在看了这个关于右值引用的精彩讲座后,我认为每个类都将受益于这样一个“移动构造函数”,模板<类T> MyClass(t&&other)编辑,当然还有一个“移动赋值操作符”,模板<类T> MyClass& operator=(t&&other),菲利普在他的回答中指出,如果它有动态分配的成员,或者通常存储指针。就像你应该有一个复制函数,赋值操作符和析构函数,如果前面提到的点适用。 想法吗?
当前回答
简单来说,记住这一点。
0法则:
类既没有自定义析构函数、复制/移动构造函数,也没有复制/移动赋值操作符。
规则3: 如果您实现了其中任何一个的自定义版本,那么您就实现了所有这些。
析构函数,复制构造函数,复制赋值
规则5: 如果你实现了一个自定义的move构造函数或move赋值操作符,你需要定义所有5个。需要移动语义。
析构函数,复制构造函数,复制赋值,移动构造函数,移动赋值
四分之一法则: 与第5条规则相同,但使用了复制和交换习惯用语。通过包含swap方法,复制赋值和移动赋值合并为一个赋值操作符。
析构函数,复制构造函数,移动构造函数,赋值,交换(一半)
引用:
https://www.linkedin.com/learning/c-plus-plus-advanced-topics/rule-of-five?u=67551194 https://en.cppreference.com/w/cpp/language/rule_of_three
其他回答
简单来说,记住这一点。
0法则:
类既没有自定义析构函数、复制/移动构造函数,也没有复制/移动赋值操作符。
规则3: 如果您实现了其中任何一个的自定义版本,那么您就实现了所有这些。
析构函数,复制构造函数,复制赋值
规则5: 如果你实现了一个自定义的move构造函数或move赋值操作符,你需要定义所有5个。需要移动语义。
析构函数,复制构造函数,复制赋值,移动构造函数,移动赋值
四分之一法则: 与第5条规则相同,但使用了复制和交换习惯用语。通过包含swap方法,复制赋值和移动赋值合并为一个赋值操作符。
析构函数,复制构造函数,移动构造函数,赋值,交换(一半)
引用:
https://www.linkedin.com/learning/c-plus-plus-advanced-topics/rule-of-five?u=67551194 https://en.cppreference.com/w/cpp/language/rule_of_three
真不敢相信没人跟这事有关。
文章基本上主张“零规则”。 我不适合引用整篇文章,但我认为这是主要观点:
具有自定义析构函数、复制/移动构造函数或复制/移动赋值操作符的类应该专门处理所有权。 其他类不应该有自定义析构函数、复制/移动 构造函数或复制/移动赋值操作符。
在我看来,这一点很重要:
标准中包括常见的“包中的所有权”类 库:std::unique_ptr和std::shared_ptr。通过使用 自定义删除器对象,两者都已变得足够灵活,可以进行管理 几乎任何种类的资源。
是的,我认为为这样的类提供一个移动构造函数会很好,但请记住:
It's only an optimization. Implementing only one or two of the copy constructor, assignment operator or destructor will probably lead to bugs, while not having a move constructor will just potentially reduce performance. Move constructor cannot always be applied without modifications. Some classes always have their pointers allocated, and thus such classes always delete their pointers in the destructor. In these cases you'll need to add extra checks to say whether their pointers are allocated or have been moved away (are now null).
我不这么认为,“三原则”是一种经验法则,它指出实现了以下其中一项而不是全部的类可能是有bug的。
拷贝构造函数 赋值运算符 析构函数
然而,省略move构造函数或move赋值操作符并不意味着存在错误。这可能是在优化时错过了一个机会(在大多数情况下),或者移动语义与这个类不相关,但这不是一个错误。
虽然在相关的情况下定义一个move构造函数可能是最佳实践,但它不是强制性的。在很多情况下,移动构造函数与类无关(例如std::complex),所有在c++ 03中行为正确的类即使没有定义移动构造函数,也会在c++ 0x中继续正确地行为。
我们现在不能说规则3变成了规则4(或规则5),而不破坏所有执行规则3的现有代码,也不实现任何形式的移动语义。
3规则的意思是,如果你实现了一个,你就必须实现所有3个。
也不知道会有任何自动生成的移动。“规则3”的目的是因为它们自动存在,如果你实现了其中一个,那么其他两个的默认实现很可能是错误的。
推荐文章
- 为什么STL如此严重地基于模板而不是继承?
- 查找当前可执行文件的路径,不包含/proc/self/exe
- 未定义对静态constexpr char的引用[]
- 在c++中,restrict关键字是什么意思?
- c++中类似于java的instanceof
- include_directories和target_include_directories在CMake中的区别是什么?
- std::make_pair与std::pair的构造函数的目的是什么?
- 如何追加一个字符到std::字符串?
- 为什么要在c++中使用嵌套类?
- 如何处理11000行c++源文件?
- 使用g++编译多个.cpp和.h文件
- 如何在c++中追加文本到文本文件?
- 在c++中使用"super
- Mmap () vs.读取块
- 什么是不归路?