![](/img/trans.png)
[英]std::is_trivially_copyable - Why are volatile scalar types not 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.