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.