//// 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/boostorg/json //// = Allocation Control As <> creates a <> object, users may want to control the way memory is allocated for it. For this reason the function has an optional <> parameter, that is used to set the {ref_memory_resource} for the result. [NOTE] <> does not have a similar parameter, as <> is not created. As the conversion result is set via an output parameter of type `value&`, the intended <> is correctly propagated. But users still should take care to not create temporaries using the default {ref_memory_resource} by accident. For example, consider this alternative implementation of `tag_invoke` for `ip_address` from the section <>. ``` 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 <> rather than relying on assignment from an initializer list. But the array uses default {ref_memory_resource}, not the one used by `jv`. To avoid creating such temporaries with an incorrect {ref_memory_resource}, using <>'s member functions <>, <>, and <> can be helpful.