cppreference定义“简单移动构造函数”:
如果满足以下所有条件,则类 T 的移动构造函数是微不足道的:
它不是用户提供的(意味着它是隐式定义或默认的);
T 没有虚成员函数;T 没有虚基类;
为 T 的每个直接基选择的移动构造函数是微不足道的;
为 T 的每个非静态类类型(或类类型数组)成员选择的移动构造函数是微不足道的。
cppreference还定义了“隐式定义的移动构造函数”:
如果隐式声明的移动构造函数既不是删除的也不是平凡的,则它由编译器定义(即生成并编译函数体)(如果 odr 使用或需要进行常量求值)。
显然,不能删除隐式声明的移动构造函数。但“这一定不是微不足道的”让我听起来很困惑。
这是否意味着如果它不是微不足道的,那么它应该是“用户提供的”?如果它已经是“用户提供的”,那么为什么必须“隐式声明的”呢?
那么这里出了什么问题呢?隐式声明的移动构造函数必须不重要的意义是什么?请帮忙。
不。如果构造函数是用户提供的,那么它就不可能是微不足道的。但不平凡并不意味着它不能被隐式声明。
我不确定你这是什么意思。移动构造函数可以是用户提供的,也可以是隐式声明的。如果它是隐式声明的,那么它可能是微不足道的(如果它满足更多标准)。
比较这两个类:
A
具有隐式定义且简单的移动构造函数。B
具有隐式声明但不平凡的移动构造函数(因为std::string
具有用户提供的移动构造函数)。两者都是隐式声明的,这意味着我没有提供它们,但它们在实现上有所不同。不需要定义简单的移动构造函数 - 这就是您提供的第二个引用的含义。编译器可以简单地将其替换为
std::memmove
call。但是,必须(由编译器)定义重要的隐式声明的移动构造函数来调用每个类成员的移动构造函数。从另一个角度来看,它可以这样呈现: