Can I memcpy() any type which has a trivial destructor?

前端 未结 4 1179
感情败类
感情败类 2021-02-20 17:02

I do realize is_pod is a sufficient condition for a type to be memcpy-able, but is has_trivial_destructor also sufficien

相关标签:
4条回答
  • 2021-02-20 17:26

    No. The requirement is that the type be trivially copyable (§3.9/2) which has a few more requirements, like the lack of a non-trivial copy constructor (§9/6).

    A trivially copyable class is a class that:

    — has no non-trivial copy constructors (12.8),

    — has no non-trivial move constructors (12.8),

    — has no non-trivial copy assignment operators (13.5.3, 12.8),

    — has no non-trivial move assignment operators (13.5.3, 12.8), and

    — has a trivial destructor (12.4).

    So you should use is_trivially_copyable instead.

    0 讨论(0)
  • 2021-02-20 17:26

    Although it's generally rare in practice, there may be a situation where a class has a non-trivial copy constructor, along with a trivial destructor. Consider a class with a static member variable that just counts how many times the class has been copied. If you memcpy it, the counter would be inaccurate.

    0 讨论(0)
  • 2021-02-20 17:32

    It seems to me that a class with a plain pointer would qualify as has_trivial_destructor, but you usually want to make a deep copy whereas memcpy would create a shallow copy.

    0 讨论(0)
  • 2021-02-20 17:43

    It is not sufficient that an object has a trivial destructor. It also needs to have trivial copy operations. The object may maintain pointers to internal buffers, for example. There is no need to destroy anything but copying would need to set up the pointers in the copied to object because they would otherwise point into the buffer of the source object.

    0 讨论(0)
提交回复
热议问题