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

标签 c++ libstdc++

我在 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 线程上询问了这个问题,他们向我指出了 https://stackoverflow.com/questions/47464819 。本质上,memcpy 不足以启动对象的生命周期,除非默认构造函数也很简单。因此,从技术上来说,就内存中的位而言,它可能是没问题的,但根据标准,这将是未定义的行为。由于这个库代码是由编译器团队编写的,如果他们认为安全,他们就有权这样做,但他们显然不相信安全性。

关于c++ - 为什么 std::vector 需要 is_trivial 来进行按位移动,而不仅仅是 is_trivially_copyable ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59690019/

相关文章:

c++ - 将 libstdc++ 静态链接是一个好习惯吗?

visual-c++ - 如何用原子操作实现 std::weak_ptr::lock?

c++ - undefined reference ,带有std::experimental::可选,尽管存在符号

c++ - 对重载函数的模糊调用的解决方法

c++ - OpenMP 和 VS 2012 发现意外的文件结尾

c++ - 覆盖默认标题搜索路径

c++11 - 为什么我不能专门化 std::tuple_element?

C++类多重继承错误

c++ - 不同的行为取决于优化选项

c++ - 如何在编译时测试 libstdc++ 的版本,而不是 GCC?