为什么 std::vector 需要 is_trivial 进行按位移动,而不仅仅是 is_trivially_copyable?

Why does std::vector require is_trivial for bitwise move, rather than just is_trivially_copyable?

我在 libstdc++ 中看到这段代码 stl_uninitialized.h:

  // This class may be specialized for specific types.
  // Also known as is_trivially_relocatable.
  template<typename _Tp, typename = void>
    struct __is_bitwise_relocatable
    : is_trivial<_Tp> { };

  template <typename _Tp, typename _Up>
    inline __enable_if_t<std::__is_bitwise_relocatable<_Tp>::value, _Tp*>
    __relocate_a_1(_Tp* __first, _Tp* __last,
           _Tp* __result, allocator<_Up>&) noexcept
    {
      ptrdiff_t __count = __last - __first;
      if (__count > 0)
    __builtin_memmove(__result, __first, __count * sizeof(_Tp));
      return __result + __count;
    }

但在我看来,memmove 适用于可平凡复制的对象,即使它们不是平凡默认可构造的。在这种情况下谁关心默认构造函数?

我在 bugzilla 线程上询问了它,他们将我指向 。本质上,memcpy 不足以启动对象的生命周期,除非默认构造函数也是微不足道的。因此,就内存中的位而言,它在技术上是可以的,但根据标准,这将是未定义的行为。由于这个库代码是由编译器团队编写的,如果他们认为它是安全的,他们无论如何都有权这样做,但他们显然不相信安全性。