[/
    Copyright (c) 2020 Krystian Stasiowski (sdkrystian@gmail.com)

    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:initializer_lists Initializer Lists]

Initializer lists can be used to construct or
assign a __value__:

[snippet_init_list_1]

Simple initializer lists produce an __array__:

[snippet_init_list_2]

Initializer lists can be nested.
Here we construct an array as an element of an array:

[snippet_init_list_3]

When a two element initializer list is nested within
an enclosing initializer list, it is unclear whether
it represents an __array__ or an __object__:

[snippet_init_list_4]

In such cases, if every element consists
of a string followed by a single value, then the enclosing
initializer list is interpreted as an __object__.
Otherwise, it is interpreted as an __array__.

[snippet_init_list_5]

To resolve the ambiguity manually, use an explicit constructor:

[snippet_init_list_6]

Initializer lists can be used to unambiguously construct or
assign an __object__ or __array__:

[snippet_init_list_7]

Similarly, an initializer list for an __object__ is always
interpreted as an __object__. In such cases, the initializer list
must be a list of key-value pairs.
For example, the following code will not compile because
`1` is not convertible to a string:

```
object jo = { { 1, 0.39 }, { "venus", 0.72 }, { "earth", 1 } };
```

The requirement for an initializer list to be interpreted as an
__object__ or __array__ when initializing such an entity only
applies to the outermost initializer list; subsequent nested
elements will follow the usual ambiguity resolution rules.

[snippet_init_list_8]

Elements that are rvalues will be moved upon initialization:

[snippet_init_list_9]

[warning
	Do not create variables of type __initializer_list__.
	This may result in temporaries being destroyed
	before the initializer list is used.
]

In all cases, the __storage_ptr__ owned by an __object__,
__array__, or __value__ constructed from an initializer list
will be propagated to each element, recursively.

[endsect]
