Allocation Control
As value_from
creates a value
object, users may want to control
the way memory is allocated for it. For this reason the function has an
optional storage_ptr
parameter, that is used to set the
memory_resource
for the result.
As the conversion result is set via an output parameter of type value&
, the
intended storage_ptr
is correctly propagated. But users still should
take care to not create temporaries using the default memory_resource
by
accident.
For example, consider this alternative implementation of tag_invoke
for
ip_address
from the section Custom Conversions.
void
tag_invoke( const value_from_tag&, value& jv, ip_address const& addr )
{
jv = array{ b[0], b[1], b[2], b[3] };
}
This implementation explicitly creates an array
rather than relying on
assignment from an initializer list. But the array uses default
memory_resource
, not the one used by jv
.
To avoid creating such temporaries with an incorrect memory_resource
,
using value
's member functions value::emplace_array
,
value::emplace_object
, and value::emplace_string
can be helpful.