簡體   English   中英

為什么 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 線程上詢問了它,他們將我指向https://stackoverflow.com/questions/47464819 本質上,memcpy 不足以啟動對象的生命周期,除非默認構造函數也是微不足道的。 因此,就內存中的位而言,技術上可能沒問題,但根據標准將是未定義的行為。 由於這個庫代碼是由編譯器團隊編寫的,如果他們認為它是安全的,他們無論如何都有權這樣做,但他們顯然不相信安全性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM