[/
    Copyright (c) 2022 Dmitry Arkhipov (grisumbras@yandex.ru)

    Distributed under the Boost Software License, Version 1.0. (See accompanying
    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

    Official repository: https://github.com/cppalliance/json
]

[/-----------------------------------------------------------------------------]


[section 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.

[note __value_to__ does not have a similar parameter,
as __value__ is not created.]

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 [link json.conversion.custom_conversions 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 `emplace_array`, `emplace_object`, and
`emplace_string` can be helpful.

[endsect]
