我希望我的 C++ 类型公开一个仅移动接口,因此我将其复制构造函数和复制赋值声明为已删除。 尽管如此,移动构造函数和移动赋值都很简单,析构函数也很简单,因此对于 C++ 标准来说,它被认为是“trivially_copyable”。 这是一个问题,因为复制这种类型的对象在语义上确实是错误的。
一个可能的解决方案是用户定义一个不执行任何操作的空析构函数。 这使得该类型不再“trivially_copyable”,但结果是该类型对于 Itanium ABI 不再“对于调用而言是微不足道的”,这可能会对性能产生负面影响。
有没有办法同时实现所有这些目标? 该类型应该具有简单的移动构造函数、移动赋值函数和析构函数。 该类型不应该是可轻易复制的。 对于调用 Itanium ABI 的目的,该类型应该很简单。
您可以使移动构造函数变得简单,但移动赋值却变得不那么简单,即
struct MyType {
//...
MyType(MyType&&) noexcept = default;
inline MyType& operator=(MyType&&) noexcept;
//...
};
inline MyType& MyType::operator=(MyType&&) noexcept = default;
要使类型成为“普通可复制”,所有符合条件的非删除构造函数、析构函数和赋值运算符都必须是普通的。然而,为了调用目的而微不足道属性仅查看构造函数和析构函数。 该类型应该具有简单的移动构造函数、移动赋值函数和析构函数。
不,这个要求使它不可能。您基本上要求该类型可以简单复制,但又不能简单复制。您的要求基本上就是该属性的定义。