我会通过
定义“平凡可移动”调用移动构造函数(或移动赋值运算符)是 相当于将字节memcpy到新目的地而不是调用 移动对象上的析构函数。
例如,如果您知道此属性成立,则可以使用realloc
来调整std :: vector或内存池的大小。
失败的类型通常会指向需要由移动构造函数/赋值运算符更新的内容。
我可以找到标准中没有这种类型的特征。 我想知道这是否已经有一个(更好的)名称,是否已被讨论以及是否有一些图书馆利用这种特征。
编辑1:
从前几条评论中,std::is_trivially_move_constructible
和std::is_trivially_move_assignable
并不等同于我所寻找的内容。
我相信他们会给包含自己指针的类型true
,因为阅读你自己的成员似乎属于“琐碎”操作。
编辑2:
正确实现后,指向自身的类型将不会轻易移动或移动可分配,因为移动ctor / move赋值运算符不再是微不足道的。 但是,我们应该能够说unique_ptr可以安全地复制到新的位置,前提是我们不调用它的析构函数。
答案 0 :(得分:1)
嗯,这让我想到了......重载具有指向自身的结构的类型特征是非常重要的。
以下代码演示了当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.
}
答案 1 :(得分:1)