memcpy 是否保留了一个普通对象的有效性?

for*_*too 3 c++ c++20

如果一个人有一个普通类型的有效对象(在这种情况下,一个普通类型满足普通移动/复制可构造概念),并且将其存储memcpy到未初始化的内存区域,那么复制的内存区域是一个有效对象吗?

根据我所读到的假设:对象仅在其构造函数被调用时才有效。

Fra*_*eux 7

将普通类型的对象复制std::memcpy到适当大小和对齐的存储中将隐式地在该位置开始新对象的生命周期。

有一种类型称为隐式生命周期类型 ,其要求是:

  • 标量类型,或者
  • 数组类型,或者
  • 聚合类类型,或者
  • 一个类类型有
    • 至少一个普通的合格构造函数,以及
    • 一个简单的、未删除的析构函数,
  • 或上述类型之一的简历限定版本。

简单类类型 满足这些要求。

隐式生命周期类型的对象具有其生命周期可以通过多个函数或操作隐式启动的属性:

  • char开始、unsigned char、 或, (C++17 起)类型数组的生命周期的操作,std::byte在这种情况下,在数组中创建此类对象,
  • 调用以下分配函数,在这种情况下,这些对象是
    • 在分配的存储中创建:
    • 新运算符
    • 运算符新[]
    • std::malloc
    • std::calloc
    • std::realloc
    • std::aligned_alloc (C++17 起)
  • 调用以下对象表示复制函数,在这种情况下,将在存储的目标区域或结果中创建此类对象:
    • std::memcpy
    • std::memmove
    • std::bit_cast (C++20 起)