Can someone provide a more lucid explanation of these two terms?
In other words, some simple explanation with an example, please.
(from : cppreference.com)
MoveInsertable : Specifies that a rvalue of the type can be copied in uninitialized storage.
CopyInsertable : Specifies that an instance of the type can be copy-constructed in-place, in uninitialized storage.
These requirements are a relationship between a type T and a container X. A container has an allocator type, A, which it uses to allocate the memory for its contained objects.
If m is one of these allocators, p a T*, rv an rvalue of type T, and v an expression of type T:
CopyInsertable is defined by the standard with:
TisCopyInsertableintoXmeans that the following expression is well-formed:allocator_traits<A>::construct(m, p, v);
MoveInsertable is defined by the standard with:
TisMoveInsertableintoXmeans that the following expression is well-formed:allocator_traits<A>::construct(m, p, rv);
Now to understand these definitions, we must know what allocator_traits<A>::construct does. Quite simply, in this case it calls:
m.construct(p, v) // CopyInsertable case
m.construct(p, rv) // MoveInsertable case
v and rv still have their respective value categories here because std::forward is applied to the argument of allocator_traits<A>::construct.
So what does an allocators construct member function do? Well, as you might expect, it constructs an object of type T at the location p by doing:
::new ((void*)p) T(v) // CopyInsertable case
::new ((void*)p) T(rv) // MoveInsertable case
Again, v and rv are std::forwarded.
Of course, these will invoke the copy or move constructors respectively.
So:
T is CopyInsertable into X: the allocator for X can placement-new construct an element of T, passing an expression of type T
T is MoveInsertable into X: the allocator for X can placement-new construct an element of T, passing an rvalue of type T
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With