J.N*_*.N. 5 c++ type-traits move-semantics
我将“微不足道的可移动”定义为
调用移动构造函数(或移动赋值运算符)相当于将字节 memcpy 到新目标,而不是对移出的对象调用析构函数。
例如,如果您知道此属性成立,则可以使用它realloc来调整 std::vector 或内存池的大小。
失败的类型通常会有指向其内容的指针,需要由移动构造函数/赋值运算符更新。
我可以找到的标准中没有这样的类型特征。我想知道这是否已经有一个(更好的)名称,是否已经被讨论过以及是否有一些库利用了这样的特性。
编辑1:
从前几条评论来看,std::is_trivially_move_constructible并不std::is_trivially_move_assignable等同于我正在寻找的内容。我相信他们会给出true包含指向自身的指针的类型,因为读取您自己的成员似乎属于“琐碎”操作。
编辑2:
当正确实现时,指向自身的类型将不再是 trivially_move_constructible 或 move_assignable,因为 move ctor / move 赋值运算符不再是微不足道的。不过,我们应该可以说,只要我们不调用它的析构函数,unique_ptr 就可以安全地复制到新位置。
嗯,这让我想到......重载持有指向自身的指针的结构的类型特征非常重要。
以下代码演示了当 type_traits 未正确定义时,错误在代码中蔓延的速度有多快。
#include <memory>
#include <type_traits>
struct A
{
int a;
int b;
int* p{&a};
};
int main()
{
auto p = std::make_unique<A>();
A a = std::move(*p.get()); // gets moved here, a.p is dangling.
return std::is_move_assignable<A>::value; // <-- yet, this returns true.
}
Run Code Online (Sandbox Code Playgroud)