为什么在类中显式默认析构函数禁用默认移动构造函数?我知道,正如现有的几个答案所解释的那样。(例如Explicitly defaulted destructor disables default move constructor in a class )
我想知道为什么:当它实际上没有做任何暗示移动构造函数可能需要自定义代码的事情时,它的理由是什么?事实上,我们建议人们使用=default而不是空体,因为这样编译器就知道除了自动操作之外,它不会做任何事情,就好像它是在没有任何声明的情况下自动生成的。
真正清楚的是,我知道为什么定义一个包含您自己逻辑的析构函数应该禁止自动生成。我要指出的是,与让编译器隐式生成相比,=default并没有改变任何东西,所以这个理由在这里不适用。
我记得>10年前,有很多关于什么是正确的方式来具体说明它的讨论。我不记得,如果我知道了,为什么它最终会这样做。有谁知道为什么这本身就是一个特别可取的特性的令人信服的原因,或者是某种技术上的原因,为什么它应该是这样?
演示:https://gcc.godbolt.org/z/86WGMs7bq
#include <type_traits>
#include <utility>
#include <string>
#include <iostream>
struct C
{
std::string s;
C () : s{"default ctor"} {}
// ~C() = default; // <<< comment this line out, and we see that original.s has its contents "stolen"
// <<< with this dtor declared, the original string is copied.
};
int main()
{
C original;
original.s = "value changed";
C other { std::move(original) };
using std::cout;
cout << "original now: " << original.s << '\n';
cout << "other is: " << other.s << '\n';
}这条规则是在C++大会视频中提到的,这让我想起了这一点。
发布于 2021-12-04 23:57:19
我认为最好的理由是一致性:显式默认复制构造函数(除其他外)禁用隐式移动构造函数,因此最简单的规则是,将相关特殊成员函数的任何声明都禁用。
反过来,A(const A&)=default;之所以产生这种效果,是因为它增加了表达式的功能:一个人可以在没有繁琐且容易出错的成员初始化列表的情况下,定义类,这些类在“从”迁移时保留其资源(为否则的接收器接口提供一个异常)。尽管=default在那里提供的信息并不比在析构函数上提供的信息多:一般说来,赋予这些结构以特定的含义是有意义的,因为没有其他效果。如果它们确实有其他含义,那么假设使用它们的程序员除了它们的直接语义之外,还需要一些其他的行为更改,这是不安全的。
在这个问题上,为什么要鼓励一般地写~A()=default; 或 ~A() {}?这两种方法都不会向编译器传递任何内部信息,而使用隐式声明的析构函数的行为通常更可取。
https://stackoverflow.com/questions/70207000
复制相似问题