c ++类型特征说“平凡可移动” -

时间:2017-08-18 03:14:10

标签: c++ move-semantics typetraits

我会通过

定义“平凡可移动”
  

调用移动构造函数(或移动赋值运算符)是   相当于将字节memcpy到新目的地而不是调用   移动对象上的析构函数。

例如,如果您知道此属性成立,则可以使用realloc来调整std :: vector或内存池的大小。

失败的类型通常会指向需要由移动构造函数/赋值运算符更新的内容。

我可以找到标准中没有这种类型的特征。 我想知道这是否已经有一个(更好的)名称,是否已被讨论以及是否有一些图书馆利用这种特征。

编辑1:

从前几条评论中,std::is_trivially_move_constructiblestd::is_trivially_move_assignable并不等同于我所寻找的内容。 我相信他们会给包含自己指针的类型true,因为阅读你自己的成员似乎属于“琐碎”操作。

编辑2:

正确实现后,指向自身的类型将不会轻易移动或移动可分配,因为移动ctor / move赋值运算符不再是微不足道的。 但是,我们应该能够说unique_ptr可以安全地复制到新的位置,前提是我们不调用它的析构函数。

2 个答案:

答案 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)

我认为您需要的是提案P1144中的std::is_trivially_relocatable。不幸的是,该提案并未纳入C++20中,因此我们不应该在2023年之前提出。令人遗憾的是,由于这种类型特征可以对std::vector和类似类型进行优化。