prohibit C++11 move from Document to Value
As reported in #387, silently moving a `GenericDocument` to a `GenericValue` can lead to object slicing and premature deletion of the owning allocator of the (surviving) `GenericValue`. To reduce this risk, prohibit move construction of a `GenericValue` from a `GenericDocument`.
This commit is contained in:
parent
823b731896
commit
fec9e8a4f2
@ -69,6 +69,9 @@ RAPIDJSON_NAMESPACE_BEGIN
|
|||||||
template <typename Encoding, typename Allocator>
|
template <typename Encoding, typename Allocator>
|
||||||
class GenericValue;
|
class GenericValue;
|
||||||
|
|
||||||
|
template <typename Encoding, typename Allocator, typename StackAllocator>
|
||||||
|
class GenericDocument;
|
||||||
|
|
||||||
//! Name-value pair in a JSON object value.
|
//! Name-value pair in a JSON object value.
|
||||||
/*!
|
/*!
|
||||||
This class was internal to GenericValue. It used to be a inner struct.
|
This class was internal to GenericValue. It used to be a inner struct.
|
||||||
@ -446,6 +449,16 @@ private:
|
|||||||
//! Copy constructor is not permitted.
|
//! Copy constructor is not permitted.
|
||||||
GenericValue(const GenericValue& rhs);
|
GenericValue(const GenericValue& rhs);
|
||||||
|
|
||||||
|
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
||||||
|
//! Moving from a GenericDocument is not permitted.
|
||||||
|
template <typename StackAllocator>
|
||||||
|
GenericValue(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);
|
||||||
|
|
||||||
|
//! Move assignment from a GenericDocument is not permitted.
|
||||||
|
template <typename StackAllocator>
|
||||||
|
GenericValue& operator=(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);
|
||||||
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//! Constructor with JSON value type.
|
//! Constructor with JSON value type.
|
||||||
@ -1792,7 +1805,7 @@ public:
|
|||||||
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
||||||
//! Move constructor in C++11
|
//! Move constructor in C++11
|
||||||
GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT
|
GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT
|
||||||
: ValueType(std::move(rhs)),
|
: ValueType(std::forward<ValueType>(rhs)), // explicit cast to avoid prohibited move from Document
|
||||||
allocator_(rhs.allocator_),
|
allocator_(rhs.allocator_),
|
||||||
ownAllocator_(rhs.ownAllocator_),
|
ownAllocator_(rhs.ownAllocator_),
|
||||||
stack_(std::move(rhs.stack_)),
|
stack_(std::move(rhs.stack_)),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user