diff --git a/.github/workflows/check_api_docs.yml b/.github/workflows/check_api_docs.yml
new file mode 100644
index 000000000..d5800f508
--- /dev/null
+++ b/.github/workflows/check_api_docs.yml
@@ -0,0 +1,81 @@
+name: "Check API documentation"
+
+on:
+ pull_request:
+
+permissions:
+ contents: read
+
+jobs:
+ check_api_docs:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Harden Runner
+ uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0
+ with:
+ egress-policy: audit
+
+ - name: Checkout pull request
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+
+ - name: Install clang
+ # Used only as a subprocess for `clang++ -E -v` system-include-path discovery in
+ # extract_api.py; it does not need to version-match the pinned libclang pip wheel
+ # below, which does the actual AST parsing. Do not "fix" this to be version-matched.
+ run: sudo apt-get update && sudo apt-get install -y clang
+
+ - name: Install Python dependencies
+ run: pip install -r tools/api_checker/requirements.txt
+
+ - name: Extract API and regenerate the committed surface file
+ run: |
+ python3 tools/api_checker/extract_api.py \
+ --header include/nlohmann/json.hpp \
+ --include include \
+ --output /tmp/api_snapshot.json \
+ --surface-output tools/api_checker/api_surface.json
+
+ - name: "Check API documentation (Phase 1: advisory)"
+ # Surfaces missing/broken @sa links without failing the job while the backlog from the
+ # initial AST-based rollout is burned down. See tools/api_checker/POLICY.md and the PR
+ # that introduced this workflow for the two-phase rollout plan.
+ continue-on-error: true
+ run: |
+ python3 tools/api_checker/check_docs.py \
+ --snapshot /tmp/api_snapshot.json
+
+ - name: Check macro documentation (advisory only)
+ # Cross-checks docs/mkdocs/docs/api/macros/ pages against #define sites. Only checks the
+ # documented-macro-still-exists direction; never blocks CI. See POLICY.md.
+ run: python3 tools/api_checker/check_macros.py
+
+ - name: Check for uncommitted API surface changes
+ id: diff
+ run: |
+ mkdir -p ${{ github.workspace }}/patch
+ git diff --patch --no-color -- tools/api_checker/api_surface.json > ${{ github.workspace }}/patch/api_surface.patch
+ if [ -s ${{ github.workspace }}/patch/api_surface.patch ]; then
+ echo "tools/api_checker/api_surface.json is out of date. Diff:"
+ cat ${{ github.workspace }}/patch/api_surface.patch
+ echo "has_diff=true" >> "$GITHUB_OUTPUT"
+ else
+ echo "has_diff=false" >> "$GITHUB_OUTPUT"
+ fi
+
+ # Uploaded so contributors can fix their PR with `git apply api_surface.patch`
+ # instead of installing libclang locally.
+ - name: Upload patch
+ if: steps.diff.outputs.has_diff == 'true'
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: api-surface-patch
+ path: patch/api_surface.patch
+
+ - name: Fail if API surface file is not up to date
+ # Unlike the doc-backlog check above, this is purely mechanical regeneration with no
+ # backlog to phase in -- blocking from the start, matching check_amalgamation.yml's
+ # precedent. Contributors who add/remove/rename public API must regenerate and commit
+ # tools/api_checker/api_surface.json as part of their PR.
+ if: steps.diff.outputs.has_diff == 'true'
+ run: exit 1
diff --git a/.gitignore b/.gitignore
index 03fe8147e..3cd2a8416 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
*.gcno
*.gcda
.DS_Store
+__pycache__/
/.idea
/cmake-build-*
@@ -43,5 +44,9 @@ venv
nlohmann_json.spdx
+# api_checker: ephemeral, location/doc-status-sensitive working file (not the committed
+# release-tracking artifact -- see tools/api_checker/api_surface.json for that)
+/tools/api_checker/api_snapshot.json
+
# Bazel-related
MODULE.bazel.lock
diff --git a/README.md b/README.md
index 81b54c36b..7c57bce3f 100644
--- a/README.md
+++ b/README.md
@@ -106,7 +106,7 @@ Thanks everyone!
:books: If you want to **learn more** about how to use the library, check out the rest of the [**README**](#examples), have a look at [**code examples**](https://github.com/nlohmann/json/tree/develop/docs/mkdocs/docs/examples), or browse through the [**help pages**](https://json.nlohmann.me).
-:construction: If you want to understand the **API** better, check out the [**API Reference**](https://json.nlohmann.me/api/basic_json/) or have a look at the [quick reference](#quick-reference) below.
+:construction: If you want to understand the **API** better, check out the [**API Reference**](https://json.nlohmann.me/api/basic_json/) or have a look at the [quick reference](#quick-reference) below. The public API surface is derived mechanically and checked for documentation coverage by the tooling in [`tools/api_checker/`](tools/api_checker/), whose [POLICY.md](tools/api_checker/POLICY.md) defines what counts as public API and what stability is guaranteed.
:bug: If you found a **bug**, please check the [**FAQ**](https://json.nlohmann.me/home/faq/) if it is a known issue or the result of a design decision. Please also have a look at the [**issue list**](https://github.com/nlohmann/json/issues) before you [**create a new issue**](https://github.com/nlohmann/json/issues/new/choose). Please provide as much information as possible to help us understand and reproduce your issue.
diff --git a/docs/mkdocs/docs/api/basic_json/basic_json.md b/docs/mkdocs/docs/api/basic_json/basic_json.md
index 6aaab23c9..48b32d08e 100644
--- a/docs/mkdocs/docs/api/basic_json/basic_json.md
+++ b/docs/mkdocs/docs/api/basic_json/basic_json.md
@@ -420,7 +420,9 @@ basic_json(basic_json&& other) noexcept;
1. Since version 1.0.0.
2. Since version 1.0.0.
3. Since version 2.1.0.
-4. Since version 3.2.0.
+4. Since version 3.2.0. Also initializes the position reported by
+ [`start_pos()`](start_pos.md)/[`end_pos()`](end_pos.md) from `val` when
+ [`JSON_DIAGNOSTIC_POSITIONS`](../macros/json_diagnostic_positions.md) is enabled, since version 3.12.0.
5. Since version 1.0.0.
6. Since version 1.0.0.
7. Since version 1.0.0.
diff --git a/docs/mkdocs/docs/api/basic_json/bjdata_version_t.md b/docs/mkdocs/docs/api/basic_json/bjdata_version_t.md
new file mode 100644
index 000000000..7b638bfad
--- /dev/null
+++ b/docs/mkdocs/docs/api/basic_json/bjdata_version_t.md
@@ -0,0 +1,38 @@
+# nlohmann::basic_json::bjdata_version_t
+
+```cpp
+enum class bjdata_version_t
+{
+ draft2,
+ draft3,
+};
+```
+
+This enumeration is used in the [`to_bjdata`](to_bjdata.md) function to choose which draft version of
+the BJData specification to encode ND-array extensions for:
+
+draft2
+: encode using the BJData Draft 2 ND-array format
+
+draft3
+: encode using the BJData Draft 3 ND-array format
+
+## Examples
+
+??? example
+
+ The example shows how `bjdata_version_t` selects the BJData draft used by `to_bjdata`.
+
+ ```cpp
+ --8<-- "examples/bjdata_version_t.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/bjdata_version_t.output"
+ ```
+
+## Version history
+
+- Added in version 3.12.0.
diff --git a/docs/mkdocs/docs/api/basic_json/initializer_list_t.md b/docs/mkdocs/docs/api/basic_json/initializer_list_t.md
new file mode 100644
index 000000000..05a0c9bba
--- /dev/null
+++ b/docs/mkdocs/docs/api/basic_json/initializer_list_t.md
@@ -0,0 +1,32 @@
+# nlohmann::basic_json::initializer_list_t
+
+```cpp
+using initializer_list_t = std::initializer_list>;
+```
+
+The type used for the initializer-list [constructor](basic_json.md) (overload 5) and for functions
+such as [`operator=`](operator=.md) that accept a braced-init-list of JSON values. Each element wraps a
+`basic_json` value or something convertible to one, deferring the decision of whether the list should be
+parsed as a JSON array or a JSON object to the constructor itself.
+
+See the [constructor](basic_json.md) documentation for how `initializer_list_t` values are interpreted.
+
+## Examples
+
+??? example
+
+ The example shows how an `initializer_list_t` is used to construct a JSON value.
+
+ ```cpp
+ --8<-- "examples/initializer_list_t.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/initializer_list_t.output"
+ ```
+
+## Version history
+
+- Since version 1.0.0.
diff --git a/docs/mkdocs/docs/api/basic_json/json_sax_t.md b/docs/mkdocs/docs/api/basic_json/json_sax_t.md
new file mode 100644
index 000000000..4ac52be4a
--- /dev/null
+++ b/docs/mkdocs/docs/api/basic_json/json_sax_t.md
@@ -0,0 +1,31 @@
+# nlohmann::basic_json::json_sax_t
+
+```cpp
+using json_sax_t = json_sax;
+```
+
+The [`json_sax`](../json_sax/index.md) interface bound to this `basic_json` specialization, i.e. with
+`BasicJsonType` fixed to `basic_json`. Used as the SAX interface type by [`sax_parse`](sax_parse.md) and
+other SAX-based parsing functions.
+
+See [`nlohmann::json_sax`](../json_sax/index.md) for more information.
+
+## Examples
+
+??? example
+
+ The example shows the type `json_sax_t`.
+
+ ```cpp
+ --8<-- "examples/json_sax_t.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/json_sax_t.output"
+ ```
+
+## Version history
+
+- Added in version 3.2.0.
diff --git a/docs/mkdocs/docs/api/basic_json/operator=.md b/docs/mkdocs/docs/api/basic_json/operator=.md
index 4639783de..aceb21a7a 100644
--- a/docs/mkdocs/docs/api/basic_json/operator=.md
+++ b/docs/mkdocs/docs/api/basic_json/operator=.md
@@ -51,3 +51,5 @@ Linear.
## Version history
- Added in version 1.0.0.
+- The `noexcept` specification was extended to also depend on
+ [`json_base_class_t`](json_base_class_t.md)'s move-assignment in version 3.11.3.
diff --git a/docs/mkdocs/docs/api/basic_json/operator_ValueType.md b/docs/mkdocs/docs/api/basic_json/operator_ValueType.md
index 231a33df4..24a4127bf 100644
--- a/docs/mkdocs/docs/api/basic_json/operator_ValueType.md
+++ b/docs/mkdocs/docs/api/basic_json/operator_ValueType.md
@@ -85,3 +85,8 @@ Linear in the size of the JSON value.
- Since version 1.0.0.
- Macros `JSON_EXPLICIT`/[`JSON_USE_IMPLICIT_CONVERSIONS`](../macros/json_use_implicit_conversions.md) added
in version 3.9.0.
+- The exclusion of `std::any` from this conversion became conditional on
+ [`JSON_HAS_STATIC_RTTI`](../macros/json_has_static_rtti.md) in version 3.11.3.
+- `std::optional` excluded from this conversion in version 3.13.0; use
+ [`get>()`](get.md)/[`get_to()`](get_to.md) instead (see
+ [Converting values](../../features/conversions.md)).
diff --git a/docs/mkdocs/docs/api/byte_container_with_subtype/container_type.md b/docs/mkdocs/docs/api/byte_container_with_subtype/container_type.md
new file mode 100644
index 000000000..df3b3eb5d
--- /dev/null
+++ b/docs/mkdocs/docs/api/byte_container_with_subtype/container_type.md
@@ -0,0 +1,32 @@
+# nlohmann::byte_container_with_subtype::container_type
+
+```cpp
+using container_type = BinaryType;
+```
+
+The type of the underlying binary container, forwarded from the `BinaryType` template parameter that
+`byte_container_with_subtype` is instantiated with. `byte_container_with_subtype` publicly inherits from
+`container_type`.
+
+See [`basic_json::binary_t`](../basic_json/binary_t.md) for the type typically used to instantiate
+`BinaryType`.
+
+## Examples
+
+??? example
+
+ The example shows the type `container_type`.
+
+ ```cpp
+ --8<-- "examples/byte_container_with_subtype__container_type.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/byte_container_with_subtype__container_type.output"
+ ```
+
+## Version history
+
+- Since version 3.8.0.
diff --git a/docs/mkdocs/docs/api/byte_container_with_subtype/operator_eq.md b/docs/mkdocs/docs/api/byte_container_with_subtype/operator_eq.md
new file mode 100644
index 000000000..296456c3b
--- /dev/null
+++ b/docs/mkdocs/docs/api/byte_container_with_subtype/operator_eq.md
@@ -0,0 +1,45 @@
+# nlohmann::byte_container_with_subtype::operator==
+
+```cpp
+bool operator==(const byte_container_with_subtype& rhs) const;
+```
+
+Compares two `byte_container_with_subtype` values for equality by comparing the underlying binary
+container, the subtype, and whether a subtype is set.
+
+## Parameters
+
+`rhs` (in)
+: value to compare `*this` against
+
+## Return value
+
+whether `*this` and `rhs` are equal
+
+## Exception safety
+
+No-throw guarantee: this function never throws exceptions.
+
+## Complexity
+
+Linear in the size of the underlying binary container.
+
+## Examples
+
+??? example
+
+ The example demonstrates comparing `byte_container_with_subtype` values.
+
+ ```cpp
+ --8<-- "examples/byte_container_with_subtype__operator_eq.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/byte_container_with_subtype__operator_eq.output"
+ ```
+
+## Version history
+
+- Since version 3.8.0.
diff --git a/docs/mkdocs/docs/api/byte_container_with_subtype/operator_ne.md b/docs/mkdocs/docs/api/byte_container_with_subtype/operator_ne.md
new file mode 100644
index 000000000..2fd48c3c9
--- /dev/null
+++ b/docs/mkdocs/docs/api/byte_container_with_subtype/operator_ne.md
@@ -0,0 +1,45 @@
+# nlohmann::byte_container_with_subtype::operator!=
+
+```cpp
+bool operator!=(const byte_container_with_subtype& rhs) const;
+```
+
+Compares two `byte_container_with_subtype` values for inequality. Implemented as the negation of
+[`operator==`](operator_eq.md).
+
+## Parameters
+
+`rhs` (in)
+: value to compare `*this` against
+
+## Return value
+
+whether `*this` and `rhs` are not equal
+
+## Exception safety
+
+No-throw guarantee: this function never throws exceptions.
+
+## Complexity
+
+Linear in the size of the underlying binary container.
+
+## Examples
+
+??? example
+
+ The example demonstrates comparing `byte_container_with_subtype` values.
+
+ ```cpp
+ --8<-- "examples/byte_container_with_subtype__operator_ne.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/byte_container_with_subtype__operator_ne.output"
+ ```
+
+## Version history
+
+- Since version 3.8.0.
diff --git a/docs/mkdocs/docs/api/byte_container_with_subtype/subtype_type.md b/docs/mkdocs/docs/api/byte_container_with_subtype/subtype_type.md
new file mode 100644
index 000000000..4e24a6047
--- /dev/null
+++ b/docs/mkdocs/docs/api/byte_container_with_subtype/subtype_type.md
@@ -0,0 +1,28 @@
+# nlohmann::byte_container_with_subtype::subtype_type
+
+```cpp
+using subtype_type = std::uint64_t;
+```
+
+The type used to store the optional binary subtype tag. See [`subtype`](subtype.md) and
+[`set_subtype`](set_subtype.md).
+
+## Examples
+
+??? example
+
+ The example shows the type `subtype_type`.
+
+ ```cpp
+ --8<-- "examples/byte_container_with_subtype__subtype_type.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/byte_container_with_subtype__subtype_type.output"
+ ```
+
+## Version history
+
+- Since version 3.8.0.
diff --git a/docs/mkdocs/docs/api/json_sax/binary_t.md b/docs/mkdocs/docs/api/json_sax/binary_t.md
new file mode 100644
index 000000000..2b68b32e2
--- /dev/null
+++ b/docs/mkdocs/docs/api/json_sax/binary_t.md
@@ -0,0 +1,30 @@
+# nlohmann::json_sax::binary_t
+
+```cpp
+using binary_t = typename BasicJsonType::binary_t;
+```
+
+The type used by the [`binary`](binary.md) callback for JSON binary values, forwarded from the
+`BasicJsonType` template parameter.
+
+See [`basic_json::binary_t`](../basic_json/binary_t.md) for more information.
+
+## Examples
+
+??? example
+
+ The example shows the type `binary_t` and its relation to `basic_json::binary_t`.
+
+ ```cpp
+ --8<-- "examples/json_sax__binary_t.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/json_sax__binary_t.output"
+ ```
+
+## Version history
+
+- Added in version 3.8.0.
diff --git a/docs/mkdocs/docs/api/json_sax/json_sax.md b/docs/mkdocs/docs/api/json_sax/json_sax.md
new file mode 100644
index 000000000..cdaedc2db
--- /dev/null
+++ b/docs/mkdocs/docs/api/json_sax/json_sax.md
@@ -0,0 +1,33 @@
+# nlohmann::json_sax::json_sax
+
+```cpp
+// (1)
+json_sax() = default;
+
+// (2)
+json_sax(const json_sax&) = default;
+
+// (3)
+json_sax(json_sax&&) noexcept = default;
+```
+
+1. Default constructor.
+2. Copy constructor.
+3. Move constructor.
+
+`json_sax` is a pure abstract base class with no data members of its own, so all three constructors are
+defaulted and only exist to make derived SAX consumers explicitly copyable/movable.
+
+## Exception safety
+
+No-throw guarantee: none of these constructors throw exceptions.
+
+## Complexity
+
+Constant.
+
+
+
+## Version history
+
+- Added in version 3.2.0.
diff --git a/docs/mkdocs/docs/api/json_sax/number_float_t.md b/docs/mkdocs/docs/api/json_sax/number_float_t.md
new file mode 100644
index 000000000..32c7997d7
--- /dev/null
+++ b/docs/mkdocs/docs/api/json_sax/number_float_t.md
@@ -0,0 +1,30 @@
+# nlohmann::json_sax::number_float_t
+
+```cpp
+using number_float_t = typename BasicJsonType::number_float_t;
+```
+
+The type used by the [`number_float`](number_float.md) callback for JSON floating-point numbers,
+forwarded from the `BasicJsonType` template parameter.
+
+See [`basic_json::number_float_t`](../basic_json/number_float_t.md) for more information.
+
+## Examples
+
+??? example
+
+ The example shows the type `number_float_t` and its relation to `basic_json::number_float_t`.
+
+ ```cpp
+ --8<-- "examples/json_sax__number_float_t.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/json_sax__number_float_t.output"
+ ```
+
+## Version history
+
+- Added in version 3.2.0.
diff --git a/docs/mkdocs/docs/api/json_sax/number_integer_t.md b/docs/mkdocs/docs/api/json_sax/number_integer_t.md
new file mode 100644
index 000000000..b80f8a283
--- /dev/null
+++ b/docs/mkdocs/docs/api/json_sax/number_integer_t.md
@@ -0,0 +1,30 @@
+# nlohmann::json_sax::number_integer_t
+
+```cpp
+using number_integer_t = typename BasicJsonType::number_integer_t;
+```
+
+The type used by the [`number_integer`](number_integer.md) callback for JSON integer numbers, forwarded
+from the `BasicJsonType` template parameter.
+
+See [`basic_json::number_integer_t`](../basic_json/number_integer_t.md) for more information.
+
+## Examples
+
+??? example
+
+ The example shows the type `number_integer_t` and its relation to `basic_json::number_integer_t`.
+
+ ```cpp
+ --8<-- "examples/json_sax__number_integer_t.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/json_sax__number_integer_t.output"
+ ```
+
+## Version history
+
+- Added in version 3.2.0.
diff --git a/docs/mkdocs/docs/api/json_sax/number_unsigned_t.md b/docs/mkdocs/docs/api/json_sax/number_unsigned_t.md
new file mode 100644
index 000000000..0d906d2ce
--- /dev/null
+++ b/docs/mkdocs/docs/api/json_sax/number_unsigned_t.md
@@ -0,0 +1,30 @@
+# nlohmann::json_sax::number_unsigned_t
+
+```cpp
+using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+```
+
+The type used by the [`number_unsigned`](number_unsigned.md) callback for JSON unsigned integer numbers,
+forwarded from the `BasicJsonType` template parameter.
+
+See [`basic_json::number_unsigned_t`](../basic_json/number_unsigned_t.md) for more information.
+
+## Examples
+
+??? example
+
+ The example shows the type `number_unsigned_t` and its relation to `basic_json::number_unsigned_t`.
+
+ ```cpp
+ --8<-- "examples/json_sax__number_unsigned_t.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/json_sax__number_unsigned_t.output"
+ ```
+
+## Version history
+
+- Added in version 3.2.0.
diff --git a/docs/mkdocs/docs/api/json_sax/operator=.md b/docs/mkdocs/docs/api/json_sax/operator=.md
new file mode 100644
index 000000000..ddf2150e3
--- /dev/null
+++ b/docs/mkdocs/docs/api/json_sax/operator=.md
@@ -0,0 +1,29 @@
+# nlohmann::json_sax::operator=
+
+```cpp
+// (1)
+json_sax& operator=(const json_sax&) = default;
+
+// (2)
+json_sax& operator=(json_sax&&) noexcept = default;
+```
+
+1. Copy assignment operator.
+2. Move assignment operator.
+
+`json_sax` is a pure abstract base class with no data members of its own, so both assignment operators
+are defaulted and only exist to make derived SAX consumers explicitly copy-/move-assignable.
+
+## Exception safety
+
+No-throw guarantee: neither operator throws exceptions.
+
+## Complexity
+
+Constant.
+
+
+
+## Version history
+
+- Added in version 3.2.0.
diff --git a/docs/mkdocs/docs/api/json_sax/string_t.md b/docs/mkdocs/docs/api/json_sax/string_t.md
new file mode 100644
index 000000000..9923d8d68
--- /dev/null
+++ b/docs/mkdocs/docs/api/json_sax/string_t.md
@@ -0,0 +1,30 @@
+# nlohmann::json_sax::string_t
+
+```cpp
+using string_t = typename BasicJsonType::string_t;
+```
+
+The type used by the [`string`](string.md) and [`key`](key.md) callbacks for JSON strings and object
+keys, forwarded from the `BasicJsonType` template parameter.
+
+See [`basic_json::string_t`](../basic_json/string_t.md) for more information.
+
+## Examples
+
+??? example
+
+ The example shows the type `string_t` and its relation to `basic_json::string_t`.
+
+ ```cpp
+ --8<-- "examples/json_sax__string_t.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/json_sax__string_t.output"
+ ```
+
+## Version history
+
+- Added in version 3.2.0.
diff --git a/docs/mkdocs/docs/api/json_sax/~json_sax.md b/docs/mkdocs/docs/api/json_sax/~json_sax.md
new file mode 100644
index 000000000..defe9dd08
--- /dev/null
+++ b/docs/mkdocs/docs/api/json_sax/~json_sax.md
@@ -0,0 +1,22 @@
+# nlohmann::json_sax::~json_sax
+
+```cpp
+virtual ~json_sax() = default;
+```
+
+Destructor. Virtual to allow proper destruction of derived SAX consumer classes through a
+pointer/reference to `json_sax`.
+
+## Exception safety
+
+No-throw guarantee: this destructor never throws exceptions.
+
+## Complexity
+
+Constant.
+
+
+
+## Version history
+
+- Added in version 3.2.0.
diff --git a/docs/mkdocs/docs/api/ordered_json.md b/docs/mkdocs/docs/api/ordered_json.md
index b28fe36f6..ce3b748ae 100644
--- a/docs/mkdocs/docs/api/ordered_json.md
+++ b/docs/mkdocs/docs/api/ordered_json.md
@@ -8,7 +8,7 @@ This type preserves the insertion order of object keys.
## Iterator invalidation
-The type is based on [`ordered_map`](ordered_map.md) which in turn uses a `std::vector` to store object elements.
+The type is based on [`ordered_map`](ordered_map/index.md) which in turn uses a `std::vector` to store object elements.
Therefore, adding object elements can yield a reallocation in which case all iterators (including the
[`end()`](basic_json/end.md) iterator) and all references to the elements are invalidated. Also, any iterator or
reference after the insertion point will point to the same index, which is now a different value.
@@ -31,7 +31,7 @@ reference after the insertion point will point to the same index, which is now a
## See also
-- [ordered_map](ordered_map.md)
+- [ordered_map](ordered_map/index.md)
- [Object Order](../features/object_order.md)
## Version history
diff --git a/docs/mkdocs/docs/api/ordered_map/Container.md b/docs/mkdocs/docs/api/ordered_map/Container.md
new file mode 100644
index 000000000..f7c726ad3
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/Container.md
@@ -0,0 +1,28 @@
+# nlohmann::ordered_map::Container
+
+```cpp
+using Container = std::vector, Allocator>;
+```
+
+The base container type that `ordered_map` publicly inherits from. Elements are stored in insertion
+order as `#!cpp std::pair` entries in a `std::vector`.
+
+## Examples
+
+??? example
+
+ The example shows the type `Container`.
+
+ ```cpp
+ --8<-- "examples/ordered_map__Container.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/ordered_map__Container.output"
+ ```
+
+## Version history
+
+- Added in version 3.9.0 to implement [`nlohmann::ordered_json`](../ordered_json.md).
diff --git a/docs/mkdocs/docs/api/ordered_map/at.md b/docs/mkdocs/docs/api/ordered_map/at.md
new file mode 100644
index 000000000..5e10b5c1e
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/at.md
@@ -0,0 +1,61 @@
+# nlohmann::ordered_map::at
+
+```cpp
+// (1)
+T& at(const key_type& key);
+const T& at(const key_type& key) const;
+
+// (2)
+template
+T& at(KeyType&& key);
+template
+const T& at(KeyType&& key) const;
+```
+
+1. Returns a reference to the value mapped to `key`.
+2. Same as (1), but for any `KeyType` comparable to `key_type` via [`key_compare`](key_compare.md)
+ (heterogeneous lookup, e.g. looking up by a `#!cpp const char*` without constructing a temporary
+ `key_type`). Only participates in overload resolution if `KeyType` is usable as a key type.
+
+## Template parameters
+
+`KeyType`
+: a type comparable to `key_type` via [`key_compare`](key_compare.md)
+
+## Parameters
+
+`key` (in)
+: key of the element to find
+
+## Return value
+
+reference to the mapped value of the element with key equal to `key`
+
+## Exceptions
+
+Throws `std::out_of_range` if no element with key `key` exists.
+
+## Complexity
+
+Linear in the number of elements.
+
+## Examples
+
+??? example
+
+ The example shows how `at` is used.
+
+ ```cpp
+ --8<-- "examples/ordered_map__at.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/ordered_map__at.output"
+ ```
+
+## Version history
+
+- Added in version 3.9.1 to implement [`nlohmann::ordered_json`](../ordered_json.md).
+- Overload (2) added in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/ordered_map/count.md b/docs/mkdocs/docs/api/ordered_map/count.md
new file mode 100644
index 000000000..466dc53eb
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/count.md
@@ -0,0 +1,53 @@
+# nlohmann::ordered_map::count
+
+```cpp
+// (1)
+size_type count(const key_type& key) const;
+
+// (2)
+template
+size_type count(KeyType&& key) const;
+```
+
+1. Returns the number of elements with key equal to `key` (0 or 1, since keys are unique).
+2. Same as (1), but for any `KeyType` comparable to `key_type` via [`key_compare`](key_compare.md)
+ (heterogeneous lookup). Only participates in overload resolution if `KeyType` is usable as a key type.
+
+## Template parameters
+
+`KeyType`
+: a type comparable to `key_type` via [`key_compare`](key_compare.md)
+
+## Parameters
+
+`key` (in)
+: key of the elements to count
+
+## Return value
+
+number of elements with key equal to `key` (0 or 1)
+
+## Complexity
+
+Linear in the number of elements.
+
+## Examples
+
+??? example
+
+ The example shows how `count` is used.
+
+ ```cpp
+ --8<-- "examples/ordered_map__count.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/ordered_map__count.output"
+ ```
+
+## Version history
+
+- Added in version 3.9.1 to implement [`nlohmann::ordered_json`](../ordered_json.md).
+- Overload (2) added in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/ordered_map/emplace.md b/docs/mkdocs/docs/api/ordered_map/emplace.md
new file mode 100644
index 000000000..6de7050c9
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/emplace.md
@@ -0,0 +1,58 @@
+# nlohmann::ordered_map::emplace
+
+```cpp
+// (1)
+std::pair emplace(const key_type& key, T&& t);
+
+// (2)
+template
+std::pair emplace(KeyType&& key, T&& t);
+```
+
+1. Inserts `#!cpp {key, t}` if no element with an equal key already exists (per [`key_compare`](key_compare.md)),
+ appending it at the end to preserve insertion order. If an equal key already exists, does nothing.
+2. Same as (1), but for any `KeyType` comparable to `key_type` via [`key_compare`](key_compare.md)
+ (heterogeneous lookup). Only participates in overload resolution if `KeyType` is usable as a key type.
+
+## Template parameters
+
+`KeyType`
+: a type comparable to `key_type` via [`key_compare`](key_compare.md)
+
+## Parameters
+
+`key` (in)
+: key of the element to insert
+
+`t` (in)
+: value of the element to insert
+
+## Return value
+
+pair of an iterator to the (possibly newly inserted) element, and a `bool` that is `true` if insertion
+took place and `false` if an element with an equal key already existed
+
+## Complexity
+
+Linear in the number of elements.
+
+## Examples
+
+??? example
+
+ The example shows how `emplace` is used.
+
+ ```cpp
+ --8<-- "examples/ordered_map__emplace.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/ordered_map__emplace.output"
+ ```
+
+## Version history
+
+- Added in version 3.9.0 to implement [`nlohmann::ordered_json`](../ordered_json.md).
+- Overload (2) added in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/ordered_map/erase.md b/docs/mkdocs/docs/api/ordered_map/erase.md
new file mode 100644
index 000000000..d5297b0cb
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/erase.md
@@ -0,0 +1,75 @@
+# nlohmann::ordered_map::erase
+
+```cpp
+// (1)
+size_type erase(const key_type& key);
+
+// (2)
+template
+size_type erase(KeyType&& key);
+
+// (3)
+iterator erase(iterator pos);
+
+// (4)
+iterator erase(iterator first, iterator last);
+```
+
+1. Removes the element with key equal to `key`, if any, preserving the relative order of the remaining
+ elements.
+2. Same as (1), but for any `KeyType` comparable to `key_type` via [`key_compare`](key_compare.md)
+ (heterogeneous lookup). Only participates in overload resolution if `KeyType` is usable as a key type.
+3. Removes the element at `pos`.
+4. Removes the elements in range `[first, last)`.
+
+## Template parameters
+
+`KeyType`
+: a type comparable to `key_type` via [`key_compare`](key_compare.md)
+
+## Parameters
+
+`key` (in)
+: key of the element to remove
+
+`pos` (in)
+: iterator to the element to remove
+
+`first` (in)
+: iterator to the first element to remove
+
+`last` (in)
+: iterator one past the last element to remove
+
+## Return value
+
+1. number of elements removed (0 or 1)
+2. number of elements removed (0 or 1)
+3. iterator following the removed element
+4. iterator following the last removed element
+
+## Complexity
+
+Linear in the number of elements (elements after the removed one(s) are shifted to keep storage
+contiguous).
+
+## Examples
+
+??? example
+
+ The example shows how `erase` is used.
+
+ ```cpp
+ --8<-- "examples/ordered_map__erase.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/ordered_map__erase.output"
+ ```
+
+## Version history
+
+- Added in version 3.9.0 to implement [`nlohmann::ordered_json`](../ordered_json.md).
+- Overload (2) added in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/ordered_map/find.md b/docs/mkdocs/docs/api/ordered_map/find.md
new file mode 100644
index 000000000..0a866d772
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/find.md
@@ -0,0 +1,56 @@
+# nlohmann::ordered_map::find
+
+```cpp
+// (1)
+iterator find(const key_type& key);
+const_iterator find(const key_type& key) const;
+
+// (2)
+template
+iterator find(KeyType&& key);
+template
+const_iterator find(KeyType&& key) const;
+```
+
+1. Returns an iterator to the element with key equal to `key`, or `end()` if no such element exists.
+2. Same as (1), but for any `KeyType` comparable to `key_type` via [`key_compare`](key_compare.md)
+ (heterogeneous lookup). Only participates in overload resolution if `KeyType` is usable as a key type.
+
+## Template parameters
+
+`KeyType`
+: a type comparable to `key_type` via [`key_compare`](key_compare.md)
+
+## Parameters
+
+`key` (in)
+: key of the element to find
+
+## Return value
+
+iterator to the element with key equal to `key`, or `end()` if not found
+
+## Complexity
+
+Linear in the number of elements.
+
+## Examples
+
+??? example
+
+ The example shows how `find` is used.
+
+ ```cpp
+ --8<-- "examples/ordered_map__find.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/ordered_map__find.output"
+ ```
+
+## Version history
+
+- Added in version 3.9.1 to implement [`nlohmann::ordered_json`](../ordered_json.md).
+- Overload (2) added in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/ordered_map.md b/docs/mkdocs/docs/api/ordered_map/index.md
similarity index 72%
rename from docs/mkdocs/docs/api/ordered_map.md
rename to docs/mkdocs/docs/api/ordered_map/index.md
index ca4934161..a7e7e7c3e 100644
--- a/docs/mkdocs/docs/api/ordered_map.md
+++ b/docs/mkdocs/docs/api/ordered_map/index.md
@@ -6,7 +6,7 @@ template,
struct ordered_map : std::vector, Allocator>;
```
-A minimal map-like container that preserves insertion order for use within [`nlohmann::ordered_json`](ordered_json.md)
+A minimal map-like container that preserves insertion order for use within [`nlohmann::ordered_json`](../ordered_json.md)
(`nlohmann::basic_json`).
## Template parameters
@@ -32,12 +32,12 @@ case all iterators (including the `end()` iterator) and all references to the el
- **key_type** - key type (`Key`)
- **mapped_type** - mapped type (`T`)
-- **Container** - base container type (`#!cpp std::vector, Allocator>`)
+- [**Container**](Container.md) - base container type (`#!cpp std::vector, Allocator>`)
- **iterator**
- **const_iterator**
- **size_type**
- **value_type**
-- **key_compare** - key comparison function
+- [**key_compare**](key_compare.md) - key comparison function
```cpp
std::equal_to // until C++14
@@ -46,15 +46,16 @@ std::equal_to<> // since C++14
## Member functions
-- (constructor)
-- (destructor)
-- **emplace**
-- **operator\[\]**
-- **at**
-- **erase**
-- **count**
-- **find**
-- **insert**
+- [(constructor)](ordered_map.md)
+- [(destructor)](~ordered_map.md)
+- [**operator=**](operator=.md)
+- [**emplace**](emplace.md)
+- [**operator\[\]**](operator[].md)
+- [**at**](at.md)
+- [**erase**](erase.md)
+- [**count**](count.md)
+- [**find**](find.md)
+- [**insert**](insert.md)
## Examples
@@ -74,9 +75,9 @@ std::equal_to<> // since C++14
## See also
-- [ordered_json](ordered_json.md)
+- [ordered_json](../ordered_json.md)
## Version history
-- Added in version 3.9.0 to implement [`nlohmann::ordered_json`](ordered_json.md).
+- Added in version 3.9.0 to implement [`nlohmann::ordered_json`](../ordered_json.md).
- Added **key_compare** member in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/ordered_map/insert.md b/docs/mkdocs/docs/api/ordered_map/insert.md
new file mode 100644
index 000000000..2cf589228
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/insert.md
@@ -0,0 +1,63 @@
+# nlohmann::ordered_map::insert
+
+```cpp
+// (1)
+std::pair insert(value_type&& value);
+std::pair insert(const value_type& value);
+
+// (2)
+template
+void insert(InputIt first, InputIt last);
+```
+
+1. Inserts `value` if no element with an equal key already exists (per [`key_compare`](key_compare.md)),
+ appending it at the end to preserve insertion order. If an equal key already exists, does nothing.
+2. Inserts the elements from range `[first, last)`, in iteration order, applying the same equal-key rule
+ as (1) to each element.
+
+## Template parameters
+
+`InputIt`
+: an input iterator type
+
+## Parameters
+
+`value` (in)
+: value to insert
+
+`first` (in)
+: iterator to the first element to insert
+
+`last` (in)
+: iterator one past the last element to insert
+
+## Return value
+
+1. pair of an iterator to the (possibly newly inserted) element, and a `bool` that is `true` if insertion
+ took place and `false` if an element with an equal key already existed
+2. (none)
+
+## Complexity
+
+1. Linear in the number of elements.
+2. Linear in the distance between `first` and `last`, times linear in the number of elements.
+
+## Examples
+
+??? example
+
+ The example shows how `insert` is used.
+
+ ```cpp
+ --8<-- "examples/ordered_map__insert.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/ordered_map__insert.output"
+ ```
+
+## Version history
+
+- Added in version 3.9.1 to implement [`nlohmann::ordered_json`](../ordered_json.md).
diff --git a/docs/mkdocs/docs/api/ordered_map/key_compare.md b/docs/mkdocs/docs/api/ordered_map/key_compare.md
new file mode 100644
index 000000000..bc853db88
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/key_compare.md
@@ -0,0 +1,34 @@
+# nlohmann::ordered_map::key_compare
+
+```cpp
+using key_compare = std::equal_to; // until C++14
+
+using key_compare = std::equal_to<>; // since C++14
+```
+
+The comparator used to determine key equality when looking up elements. Unlike `std::map`, `ordered_map`
+uses linear search with `key_compare` rather than an ordering relation, since element order reflects
+insertion order rather than key order.
+
+Since C++14, the transparent `#!cpp std::equal_to<>` is used, which enables heterogeneous lookup (e.g.
+looking up by a `#!cpp const char*` key without constructing a temporary `Key`).
+
+## Examples
+
+??? example
+
+ The example shows how `key_compare` is used.
+
+ ```cpp
+ --8<-- "examples/ordered_map__key_compare.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/ordered_map__key_compare.output"
+ ```
+
+## Version history
+
+- Added in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/ordered_map/operator=.md b/docs/mkdocs/docs/api/ordered_map/operator=.md
new file mode 100644
index 000000000..b6154b067
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/operator=.md
@@ -0,0 +1,32 @@
+# nlohmann::ordered_map::operator=
+
+```cpp
+// (1)
+ordered_map& operator=(const ordered_map& other);
+
+// (2)
+ordered_map& operator=(ordered_map&& other) noexcept(std::is_nothrow_move_assignable::value);
+```
+
+1. Copy assignment operator.
+2. Move assignment operator.
+
+## Parameters
+
+`other` (in)
+: value to assign from
+
+## Return value
+
+`*this`
+
+## Complexity
+
+1. Linear in the size of `other`.
+2. Constant.
+
+
+
+## Version history
+
+- Added in version 3.9.0 to implement [`nlohmann::ordered_json`](../ordered_json.md).
diff --git a/docs/mkdocs/docs/api/ordered_map/operator[].md b/docs/mkdocs/docs/api/ordered_map/operator[].md
new file mode 100644
index 000000000..b85627b69
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/operator[].md
@@ -0,0 +1,62 @@
+# nlohmann::ordered_map::operator[]
+
+```cpp
+// (1)
+T& operator[](const key_type& key);
+const T& operator[](const key_type& key) const;
+
+// (2)
+template
+T& operator[](KeyType&& key);
+template
+const T& operator[](KeyType&& key) const;
+```
+
+1. Returns a reference to the value mapped to `key`, inserting a default-constructed `T` (non-`const`
+ overload only) if no such element exists yet.
+2. Same as (1), but for any `KeyType` comparable to `key_type` via [`key_compare`](key_compare.md)
+ (heterogeneous lookup). Only participates in overload resolution if `KeyType` is usable as a key type.
+
+## Template parameters
+
+`KeyType`
+: a type comparable to `key_type` via [`key_compare`](key_compare.md)
+
+## Parameters
+
+`key` (in)
+: key of the element to find or insert
+
+## Return value
+
+reference to the mapped value of the element with key equal to `key`
+
+## Exceptions
+
+The `const` overloads throw `std::out_of_range` if no element with key `key` exists (they delegate to
+[`at`](at.md)).
+
+## Complexity
+
+Linear in the number of elements.
+
+## Examples
+
+??? example
+
+ The example shows how `operator[]` is used.
+
+ ```cpp
+ --8<-- "examples/ordered_map__operator_idx.cpp"
+ ```
+
+ Output:
+
+ ```
+ --8<-- "examples/ordered_map__operator_idx.output"
+ ```
+
+## Version history
+
+- Added in version 3.9.0 to implement [`nlohmann::ordered_json`](../ordered_json.md).
+- Overload (2) added in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/ordered_map/ordered_map.md b/docs/mkdocs/docs/api/ordered_map/ordered_map.md
new file mode 100644
index 000000000..e5b99e61b
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/ordered_map.md
@@ -0,0 +1,66 @@
+# nlohmann::ordered_map::ordered_map
+
+```cpp
+// (1)
+ordered_map() noexcept(noexcept(Container()));
+
+// (2)
+explicit ordered_map(const Allocator& alloc) noexcept(noexcept(Container(alloc)));
+
+// (3)
+template
+ordered_map(It first, It last, const Allocator& alloc = Allocator());
+
+// (4)
+ordered_map(std::initializer_list init, const Allocator& alloc = Allocator());
+
+// (5)
+ordered_map(const ordered_map&) = default;
+
+// (6)
+ordered_map(ordered_map&&) noexcept(std::is_nothrow_move_constructible::value) = default;
+```
+
+1. Default constructor. Creates an empty `ordered_map`.
+2. Creates an empty `ordered_map` using the given allocator.
+3. Creates an `ordered_map` from the elements in range `[first, last)`, inserted in iteration order.
+4. Creates an `ordered_map` from an initializer list of key/value pairs, inserted in list order.
+5. Copy constructor.
+6. Move constructor.
+
+These constructors are declared explicitly (rather than inherited via `#!cpp using Container::Container`)
+because older compilers (GCC <= 5.5, Xcode <= 9.4) do not handle the inherited constructors correctly.
+
+## Template parameters
+
+`It`
+: an input iterator type
+
+## Parameters
+
+`alloc` (in)
+: allocator to use for the underlying container
+
+`first` (in)
+: iterator to the first element to insert
+
+`last` (in)
+: iterator one past the last element to insert
+
+`init` (in)
+: initializer list of key/value pairs to insert
+
+## Complexity
+
+1. Constant.
+2. Constant.
+3. Linear in the distance between `first` and `last`.
+4. Linear in the size of `init`.
+5. Linear in the size of `other`.
+6. Constant.
+
+
+
+## Version history
+
+- Added in version 3.9.0 to implement [`nlohmann::ordered_json`](../ordered_json.md).
diff --git a/docs/mkdocs/docs/api/ordered_map/~ordered_map.md b/docs/mkdocs/docs/api/ordered_map/~ordered_map.md
new file mode 100644
index 000000000..6ad90b29d
--- /dev/null
+++ b/docs/mkdocs/docs/api/ordered_map/~ordered_map.md
@@ -0,0 +1,17 @@
+# nlohmann::ordered_map::~ordered_map
+
+```cpp
+~ordered_map() = default;
+```
+
+Destroys the `ordered_map` and frees all allocated memory.
+
+## Complexity
+
+Linear in the number of elements.
+
+
+
+## Version history
+
+- Added in version 3.9.0 to implement [`nlohmann::ordered_json`](../ordered_json.md).
diff --git a/docs/mkdocs/docs/examples/bjdata_version_t.cpp b/docs/mkdocs/docs/examples/bjdata_version_t.cpp
new file mode 100644
index 000000000..899451521
--- /dev/null
+++ b/docs/mkdocs/docs/examples/bjdata_version_t.cpp
@@ -0,0 +1,21 @@
+#include
+#include
+
+using json = nlohmann::json;
+
+int main()
+{
+ // an empty binary value is encoded differently by the two drafts:
+ // draft2 omits the optimized type marker for an empty byte array,
+ // while draft3 always writes it
+ json j = json::binary({});
+
+ // encode using BJData draft2 (the default)
+ auto v_draft2 = json::to_bjdata(j, true, true, json::bjdata_version_t::draft2);
+
+ // encode using BJData draft3
+ auto v_draft3 = json::to_bjdata(j, true, true, json::bjdata_version_t::draft3);
+
+ std::cout << "draft2 size: " << v_draft2.size() << '\n'
+ << "draft3 size: " << v_draft3.size() << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/bjdata_version_t.output b/docs/mkdocs/docs/examples/bjdata_version_t.output
new file mode 100644
index 000000000..e20f75f3e
--- /dev/null
+++ b/docs/mkdocs/docs/examples/bjdata_version_t.output
@@ -0,0 +1,2 @@
+draft2 size: 4
+draft3 size: 6
diff --git a/docs/mkdocs/docs/examples/byte_container_with_subtype__container_type.cpp b/docs/mkdocs/docs/examples/byte_container_with_subtype__container_type.cpp
new file mode 100644
index 000000000..b51355b21
--- /dev/null
+++ b/docs/mkdocs/docs/examples/byte_container_with_subtype__container_type.cpp
@@ -0,0 +1,11 @@
+#include
+#include
+
+using byte_container_with_subtype = nlohmann::byte_container_with_subtype>;
+
+int main()
+{
+ std::cout << std::boolalpha
+ << std::is_same>::value
+ << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/byte_container_with_subtype__container_type.output b/docs/mkdocs/docs/examples/byte_container_with_subtype__container_type.output
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/docs/mkdocs/docs/examples/byte_container_with_subtype__container_type.output
@@ -0,0 +1 @@
+true
diff --git a/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_eq.cpp b/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_eq.cpp
new file mode 100644
index 000000000..aa1d65f3a
--- /dev/null
+++ b/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_eq.cpp
@@ -0,0 +1,15 @@
+#include
+#include
+
+using byte_container_with_subtype = nlohmann::byte_container_with_subtype>;
+
+int main()
+{
+ byte_container_with_subtype c1({0xca, 0xfe});
+ byte_container_with_subtype c2({0xca, 0xfe});
+ byte_container_with_subtype c3({0xca, 0xfe}, 42);
+
+ std::cout << std::boolalpha
+ << "c1 == c2: " << (c1 == c2) << '\n'
+ << "c1 == c3: " << (c1 == c3) << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_eq.output b/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_eq.output
new file mode 100644
index 000000000..982b74aaf
--- /dev/null
+++ b/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_eq.output
@@ -0,0 +1,2 @@
+c1 == c2: true
+c1 == c3: false
diff --git a/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_ne.cpp b/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_ne.cpp
new file mode 100644
index 000000000..0eb371c90
--- /dev/null
+++ b/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_ne.cpp
@@ -0,0 +1,15 @@
+#include
+#include
+
+using byte_container_with_subtype = nlohmann::byte_container_with_subtype>;
+
+int main()
+{
+ byte_container_with_subtype c1({0xca, 0xfe});
+ byte_container_with_subtype c2({0xca, 0xfe});
+ byte_container_with_subtype c3({0xca, 0xfe}, 42);
+
+ std::cout << std::boolalpha
+ << "c1 != c2: " << (c1 != c2) << '\n'
+ << "c1 != c3: " << (c1 != c3) << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_ne.output b/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_ne.output
new file mode 100644
index 000000000..eeadfe717
--- /dev/null
+++ b/docs/mkdocs/docs/examples/byte_container_with_subtype__operator_ne.output
@@ -0,0 +1,2 @@
+c1 != c2: false
+c1 != c3: true
diff --git a/docs/mkdocs/docs/examples/byte_container_with_subtype__subtype_type.cpp b/docs/mkdocs/docs/examples/byte_container_with_subtype__subtype_type.cpp
new file mode 100644
index 000000000..f8d714ee2
--- /dev/null
+++ b/docs/mkdocs/docs/examples/byte_container_with_subtype__subtype_type.cpp
@@ -0,0 +1,10 @@
+#include
+#include
+
+using byte_container_with_subtype = nlohmann::byte_container_with_subtype>;
+
+int main()
+{
+ std::cout << std::boolalpha
+ << std::is_same::value << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/byte_container_with_subtype__subtype_type.output b/docs/mkdocs/docs/examples/byte_container_with_subtype__subtype_type.output
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/docs/mkdocs/docs/examples/byte_container_with_subtype__subtype_type.output
@@ -0,0 +1 @@
+true
diff --git a/docs/mkdocs/docs/examples/initializer_list_t.cpp b/docs/mkdocs/docs/examples/initializer_list_t.cpp
new file mode 100644
index 000000000..907889118
--- /dev/null
+++ b/docs/mkdocs/docs/examples/initializer_list_t.cpp
@@ -0,0 +1,13 @@
+#include
+#include
+
+using json = nlohmann::json;
+
+int main()
+{
+ // an initializer_list_t is what a braced-init-list of JSON values is deduced as
+ json::initializer_list_t init = {"a", 1, 2.0, false};
+
+ json j(init);
+ std::cout << j.dump() << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/initializer_list_t.output b/docs/mkdocs/docs/examples/initializer_list_t.output
new file mode 100644
index 000000000..dca341fd0
--- /dev/null
+++ b/docs/mkdocs/docs/examples/initializer_list_t.output
@@ -0,0 +1 @@
+["a",1,2.0,false]
diff --git a/docs/mkdocs/docs/examples/json_sax__binary_t.cpp b/docs/mkdocs/docs/examples/json_sax__binary_t.cpp
new file mode 100644
index 000000000..c86d9680d
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax__binary_t.cpp
@@ -0,0 +1,10 @@
+#include
+#include
+
+using json = nlohmann::json;
+
+int main()
+{
+ std::cout << std::boolalpha
+ << std::is_same::value << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/json_sax__binary_t.output b/docs/mkdocs/docs/examples/json_sax__binary_t.output
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax__binary_t.output
@@ -0,0 +1 @@
+true
diff --git a/docs/mkdocs/docs/examples/json_sax__number_float_t.cpp b/docs/mkdocs/docs/examples/json_sax__number_float_t.cpp
new file mode 100644
index 000000000..fa76af7b1
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax__number_float_t.cpp
@@ -0,0 +1,10 @@
+#include
+#include
+
+using json = nlohmann::json;
+
+int main()
+{
+ std::cout << std::boolalpha
+ << std::is_same::value << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/json_sax__number_float_t.output b/docs/mkdocs/docs/examples/json_sax__number_float_t.output
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax__number_float_t.output
@@ -0,0 +1 @@
+true
diff --git a/docs/mkdocs/docs/examples/json_sax__number_integer_t.cpp b/docs/mkdocs/docs/examples/json_sax__number_integer_t.cpp
new file mode 100644
index 000000000..24a9918a2
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax__number_integer_t.cpp
@@ -0,0 +1,10 @@
+#include
+#include
+
+using json = nlohmann::json;
+
+int main()
+{
+ std::cout << std::boolalpha
+ << std::is_same::value << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/json_sax__number_integer_t.output b/docs/mkdocs/docs/examples/json_sax__number_integer_t.output
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax__number_integer_t.output
@@ -0,0 +1 @@
+true
diff --git a/docs/mkdocs/docs/examples/json_sax__number_unsigned_t.cpp b/docs/mkdocs/docs/examples/json_sax__number_unsigned_t.cpp
new file mode 100644
index 000000000..93b7d442b
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax__number_unsigned_t.cpp
@@ -0,0 +1,10 @@
+#include
+#include
+
+using json = nlohmann::json;
+
+int main()
+{
+ std::cout << std::boolalpha
+ << std::is_same::value << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/json_sax__number_unsigned_t.output b/docs/mkdocs/docs/examples/json_sax__number_unsigned_t.output
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax__number_unsigned_t.output
@@ -0,0 +1 @@
+true
diff --git a/docs/mkdocs/docs/examples/json_sax__string_t.cpp b/docs/mkdocs/docs/examples/json_sax__string_t.cpp
new file mode 100644
index 000000000..a0e16c0c1
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax__string_t.cpp
@@ -0,0 +1,10 @@
+#include
+#include
+
+using json = nlohmann::json;
+
+int main()
+{
+ std::cout << std::boolalpha
+ << std::is_same::value << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/json_sax__string_t.output b/docs/mkdocs/docs/examples/json_sax__string_t.output
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax__string_t.output
@@ -0,0 +1 @@
+true
diff --git a/docs/mkdocs/docs/examples/json_sax_t.cpp b/docs/mkdocs/docs/examples/json_sax_t.cpp
new file mode 100644
index 000000000..c6b88b838
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax_t.cpp
@@ -0,0 +1,10 @@
+#include
+#include
+
+using json = nlohmann::json;
+
+int main()
+{
+ std::cout << std::boolalpha
+ << std::is_same>::value << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/json_sax_t.output b/docs/mkdocs/docs/examples/json_sax_t.output
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/docs/mkdocs/docs/examples/json_sax_t.output
@@ -0,0 +1 @@
+true
diff --git a/docs/mkdocs/docs/examples/ordered_map__Container.cpp b/docs/mkdocs/docs/examples/ordered_map__Container.cpp
new file mode 100644
index 000000000..88a8aba17
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__Container.cpp
@@ -0,0 +1,12 @@
+#include
+#include
+
+int main()
+{
+ using Map = nlohmann::ordered_map;
+
+ std::cout << std::boolalpha
+ << "Container is std::vector>: "
+ << std::is_same>>::value
+ << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/ordered_map__Container.output b/docs/mkdocs/docs/examples/ordered_map__Container.output
new file mode 100644
index 000000000..62ecb234b
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__Container.output
@@ -0,0 +1 @@
+Container is std::vector>: true
diff --git a/docs/mkdocs/docs/examples/ordered_map__at.cpp b/docs/mkdocs/docs/examples/ordered_map__at.cpp
new file mode 100644
index 000000000..e6b4a44c0
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__at.cpp
@@ -0,0 +1,26 @@
+#include
+#include
+
+int main()
+{
+ nlohmann::ordered_map m;
+ m["one"] = 1;
+ m["two"] = 2;
+
+ // access an existing element
+ std::cout << "m.at(\"one\") = " << m.at("one") << std::endl;
+
+ // modify through the reference returned by at()
+ m.at("two") = 22;
+ std::cout << "m.at(\"two\") = " << m.at("two") << std::endl;
+
+ // accessing a missing key throws
+ try
+ {
+ m.at("three");
+ }
+ catch (const std::out_of_range& e)
+ {
+ std::cout << "exception: " << e.what() << std::endl;
+ }
+}
diff --git a/docs/mkdocs/docs/examples/ordered_map__at.output b/docs/mkdocs/docs/examples/ordered_map__at.output
new file mode 100644
index 000000000..63fa10ad3
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__at.output
@@ -0,0 +1,3 @@
+m.at("one") = 1
+m.at("two") = 22
+exception: key not found
diff --git a/docs/mkdocs/docs/examples/ordered_map__count.cpp b/docs/mkdocs/docs/examples/ordered_map__count.cpp
new file mode 100644
index 000000000..15e56e905
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__count.cpp
@@ -0,0 +1,12 @@
+#include
+#include
+
+int main()
+{
+ nlohmann::ordered_map m;
+ m["one"] = 1;
+
+ std::cout << std::boolalpha
+ << "m.count(\"one\") = " << m.count("one") << '\n'
+ << "m.count(\"two\") = " << m.count("two") << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/ordered_map__count.output b/docs/mkdocs/docs/examples/ordered_map__count.output
new file mode 100644
index 000000000..5a343e55f
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__count.output
@@ -0,0 +1,2 @@
+m.count("one") = 1
+m.count("two") = 0
diff --git a/docs/mkdocs/docs/examples/ordered_map__emplace.cpp b/docs/mkdocs/docs/examples/ordered_map__emplace.cpp
new file mode 100644
index 000000000..a6deab2a5
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__emplace.cpp
@@ -0,0 +1,15 @@
+#include
+#include
+
+int main()
+{
+ nlohmann::ordered_map m;
+
+ // emplace a new element
+ auto res1 = m.emplace("one", "eins");
+ std::cout << std::boolalpha << "inserted: " << res1.second << ", value: " << res1.first->second << std::endl;
+
+ // emplace with an already-existing key: no-op, returns the existing element
+ auto res2 = m.emplace("one", "uno");
+ std::cout << std::boolalpha << "inserted: " << res2.second << ", value: " << res2.first->second << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/ordered_map__emplace.output b/docs/mkdocs/docs/examples/ordered_map__emplace.output
new file mode 100644
index 000000000..28ea2b28c
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__emplace.output
@@ -0,0 +1,2 @@
+inserted: true, value: eins
+inserted: false, value: eins
diff --git a/docs/mkdocs/docs/examples/ordered_map__erase.cpp b/docs/mkdocs/docs/examples/ordered_map__erase.cpp
new file mode 100644
index 000000000..c1ca917b5
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__erase.cpp
@@ -0,0 +1,24 @@
+#include
+#include
+
+int main()
+{
+ nlohmann::ordered_map m;
+ m["one"] = 1;
+ m["two"] = 2;
+ m["three"] = 3;
+
+ // erase by key
+ std::size_t removed = m.erase("two");
+ std::cout << "removed by key: " << removed << std::endl;
+
+ // erase by iterator
+ m.erase(m.begin());
+
+ std::cout << "remaining: ";
+ for (const auto& element : m)
+ {
+ std::cout << element.first << ' ';
+ }
+ std::cout << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/ordered_map__erase.output b/docs/mkdocs/docs/examples/ordered_map__erase.output
new file mode 100644
index 000000000..5b699b6df
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__erase.output
@@ -0,0 +1,2 @@
+removed by key: 1
+remaining: three
diff --git a/docs/mkdocs/docs/examples/ordered_map__find.cpp b/docs/mkdocs/docs/examples/ordered_map__find.cpp
new file mode 100644
index 000000000..83671319a
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__find.cpp
@@ -0,0 +1,19 @@
+#include
+#include
+
+int main()
+{
+ nlohmann::ordered_map m;
+ m["one"] = 1;
+
+ auto it = m.find("one");
+ if (it != m.end())
+ {
+ std::cout << "found: " << it->first << " = " << it->second << std::endl;
+ }
+
+ if (m.find("two") == m.end())
+ {
+ std::cout << "\"two\" not found" << std::endl;
+ }
+}
diff --git a/docs/mkdocs/docs/examples/ordered_map__find.output b/docs/mkdocs/docs/examples/ordered_map__find.output
new file mode 100644
index 000000000..e04688aa0
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__find.output
@@ -0,0 +1,2 @@
+found: one = 1
+"two" not found
diff --git a/docs/mkdocs/docs/examples/ordered_map__insert.cpp b/docs/mkdocs/docs/examples/ordered_map__insert.cpp
new file mode 100644
index 000000000..0c0bbc2d6
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__insert.cpp
@@ -0,0 +1,21 @@
+#include
+#include
+
+int main()
+{
+ nlohmann::ordered_map m;
+
+ // insert a single value
+ auto res = m.insert({"one", 1});
+ std::cout << std::boolalpha << "inserted: " << res.second << std::endl;
+
+ // insert a range from another container
+ std::vector> more = {{"two", 2}, {"three", 3}};
+ m.insert(more.begin(), more.end());
+
+ for (const auto& element : m)
+ {
+ std::cout << element.first << ':' << element.second << ' ';
+ }
+ std::cout << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/ordered_map__insert.output b/docs/mkdocs/docs/examples/ordered_map__insert.output
new file mode 100644
index 000000000..5114f1006
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__insert.output
@@ -0,0 +1,2 @@
+inserted: true
+one:1 two:2 three:3
diff --git a/docs/mkdocs/docs/examples/ordered_map__key_compare.cpp b/docs/mkdocs/docs/examples/ordered_map__key_compare.cpp
new file mode 100644
index 000000000..6bc526052
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__key_compare.cpp
@@ -0,0 +1,12 @@
+#include
+#include
+
+int main()
+{
+ using Map = nlohmann::ordered_map;
+ Map::key_compare compare{};
+
+ std::cout << std::boolalpha
+ << "compare(\"a\", \"a\") = " << compare("a", "a") << '\n'
+ << "compare(\"a\", \"b\") = " << compare("a", "b") << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/ordered_map__key_compare.output b/docs/mkdocs/docs/examples/ordered_map__key_compare.output
new file mode 100644
index 000000000..936d3dcae
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__key_compare.output
@@ -0,0 +1,2 @@
+compare("a", "a") = true
+compare("a", "b") = false
diff --git a/docs/mkdocs/docs/examples/ordered_map__operator_idx.cpp b/docs/mkdocs/docs/examples/ordered_map__operator_idx.cpp
new file mode 100644
index 000000000..aa75edbf5
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__operator_idx.cpp
@@ -0,0 +1,14 @@
+#include
+#include
+
+int main()
+{
+ nlohmann::ordered_map m;
+
+ // operator[] inserts a default-constructed value if the key doesn't exist yet
+ m["one"] = 1;
+ std::cout << "m[\"one\"] = " << m["one"] << std::endl;
+
+ // accessing again just returns the existing value
+ std::cout << "m[\"one\"] = " << m["one"] << std::endl;
+}
diff --git a/docs/mkdocs/docs/examples/ordered_map__operator_idx.output b/docs/mkdocs/docs/examples/ordered_map__operator_idx.output
new file mode 100644
index 000000000..71d296cec
--- /dev/null
+++ b/docs/mkdocs/docs/examples/ordered_map__operator_idx.output
@@ -0,0 +1,2 @@
+m["one"] = 1
+m["one"] = 1
diff --git a/docs/mkdocs/docs/home/api_changes.md b/docs/mkdocs/docs/home/api_changes.md
new file mode 100644
index 000000000..b9c65df16
--- /dev/null
+++ b/docs/mkdocs/docs/home/api_changes.md
@@ -0,0 +1,1954 @@
+# API Changes
+
+This page is a per-release reference of changes to the public API surface, derived by
+diffing the recorded snapshots under `tools/api_checker/history/` (see
+[tools/api_checker/README.md](https://github.com/nlohmann/json/blob/develop/tools/api_checker/README.md)).
+It complements, and does **not** replace, the [release notes](releases.md): the release notes
+are a curated, prose summary of everything notable about a release; this page tracks the
+public API specifically, function by function, covering `v3.1.0` through `v3.12.0` (the range
+currently backfilled into `tools/api_checker/history/`).
+
+!!! info "How to read this page"
+
+ Each release lists the functions/types whose public declaration changed, grouped by name
+ (not by individual overload). The italicized sentence is a best-effort summary of the
+ *mechanical* signature diff; a handful of entries were individually researched and cross-
+ checked against the source and documentation earlier in this investigation, but most were
+ generated from the diff shape alone, so treat the sentence as a hint about where to look,
+ not a substitute for reading the linked page. Purely cosmetic changes (annotation macros
+ such as `JSON_NODISCARD` being renamed or added library-wide, or a redundant top-level
+ `const` on a by-value parameter) are omitted from the per-function list and instead named
+ in a single collapsed line per release, since they carry no behavioral or contract
+ difference. This is a textual, not semantic, diff (see `extract_api.py`'s `identity_key()`
+ docstring) -- a name not being listed for a release means its declaration text did not
+ change in that release.
+
+## 3.12.0
+
+### [`nlohmann::basic_json::bjdata_version_t`](../api/basic_json/bjdata_version_t.md)
+
+*New enum (`draft2`/`draft3`) selecting which BJData ND-array draft `to_bjdata()` encodes for.*
+
+- New symbol.
+ ```cpp
+ using bjdata_version_t = detail::bjdata_version_t
+ ```
+
+### [`nlohmann::basic_json::diff`](../api/basic_json/diff.md)
+
+*Changes the `path` parameter's type from `std::string` to `string_t`, so it respects a custom string type instead of hardcoding `std::string`.*
+
+- Changed:
+ ```diff
+ JSON_HEDLEY_WARN_UNUSED_RESULT static basic_json diff(const basic_json& source, const basic_json& target, const
+ - std::string&
+ + string_t&
+ path = "")
+ ```
+
+### [`nlohmann::basic_json::to_bjdata`](../api/basic_json/to_bjdata.md)
+
+*Adds a `bjdata_version_t version` parameter (default `draft2`) to select between BJData draft 2 and draft 3 ND-array encoding.*
+
+- Changed:
+ ```diff
+ static std::vector to_bjdata(const basic_json& j, const bool use_size = false, const bool use_type =
+ - false)
+ + false, const bjdata_version_t version = bjdata_version_t::draft2)
+ ```
+
+**Cosmetic-only changes** (no behavioral/contract difference; omitted above): `nlohmann::basic_json::basic_json`, `nlohmann::basic_json::parse`.
+
+## 3.11.3
+
+### [`nlohmann::basic_json::operator ValueType`](../api/basic_json/operator_ValueType.md)
+
+*The `std::any` exclusion from this conversion operator's SFINAE becomes conditional on `JSON_HAS_STATIC_RTTI` instead of unconditional.*
+
+- Changed:
+ ```diff
+ template < typename ValueType, typename std::enable_if < detail::conjunction < detail::negation>, detail::negation>, #endif detail::is_detected_lazy >::value, int >::type = 0 > JSON
+ ```
+
+### [`nlohmann::basic_json::operator=`](../api/basic_json/operator=.md)
+
+*Extends the `noexcept` specification to also depend on the new `json_base_class_t` (`CustomBaseClass`) template parameter's move-assignment.*
+
+- Changed:
+ ```diff
+ basic_json& operator=(basic_json other) noexcept ( std::is_nothrow_move_constructible::value&& std::is_nothrow_move_assignable::value&& std::is_nothrow_move_const
+ - std::is_nothrow_move_assignable::value
+ + std::is_nothrow_move_assignable::value&& std::is_nothrow_move_assignable::value
+ )
+ ```
+
+## 3.11.2
+
+### [`nlohmann::basic_json::value`](../api/basic_json/value.md)
+
+*Adjusts the template constraints (SFINAE) controlling which types this overload participates in overload resolution for.*
+
+- Changed:
+ ```diff
+ - JSON_HEDLEY_NON_NULL(3) string_t value(const json_pointer& ptr, const char*
+ + template < class ValueType, class BasicJsonType, class ReturnType = typename value_return_type::type, detail::enable_if_t < detail::is_basic_json::value &
+ default_value) const
+ ```
+
+**Cosmetic-only changes** (no behavioral/contract difference; omitted above): `nlohmann::basic_json::at`, `nlohmann::basic_json::contains`.
+
+## 3.11.0
+
+### [`nlohmann::operator!=`](../api/basic_json/operator_ne.md)
+
+*Removed from the public API.*
+
+- Removes 1 overload.
+ ```cpp
+ friend bool operator!=(json_pointer const& lhs, json_pointer const& rhs) noexcept
+ ```
+
+### [`nlohmann::operator<`](../api/basic_json/operator_lt.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ friend bool operator<(const_reference lhs, const_reference rhs) noexcept {
+ - const auto lhs_type = lhs.type(); const auto rhs_type = rhs.type(); if (lhs_type == rhs_type) { switch (lhs_type) { case value_t::array: return (*lhs.m_value.array) < (*rhs.m_value
+ + JSON_IMPLEMENT_OPERATOR( <, false, false, operator<(lhs_type, rhs_type))
+ }
+ ```
+
+### [`nlohmann::operator<<`](../api/basic_json/operator_gtgt.md)
+
+*Adds a new overload.*
+
+- Adds 1 new overload.
+ ```cpp
+ friend std::ostream& operator<<(std::ostream& o, const json_pointer& ptr) { o << ptr.to_string(); return o; }
+ ```
+
+### [`nlohmann::operator<=`](../api/basic_json/operator_le.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ friend bool operator<=(const_reference lhs, const_reference rhs) noexcept {
+ + if (compares_unordered(lhs, rhs, true)) { return false; }
+ return !(rhs < lhs); }
+ ```
+
+### [`nlohmann::operator==`](../api/basic_json/operator_eq.md)
+
+*Removed from the public API.*
+
+- Removes 1 overload.
+ ```cpp
+ friend bool operator==(json_pointer const& lhs, json_pointer const& rhs) noexcept
+ ```
+
+### [`nlohmann::basic_json::at`](../api/basic_json/at.md)
+
+*Adds 4 new overloads.*
+
+- Adds 4 new overloads.
+ ```cpp
+ template::value, int> = 0> const_reference at(KeyType && key) const
+ ```
+ ```cpp
+ template::value, int> = 0> reference at(KeyType && key)
+ ```
+ ```cpp
+ template JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer) const_reference at(const ::nlohmann::json_pointer& ptr) const
+ ```
+ ```cpp
+ template JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer) reference at(const ::nlohmann::json_pointer& ptr)
+ ```
+
+### [`nlohmann::basic_json::count`](../api/basic_json/count.md)
+
+*Changes parameter `KeyT&& key` to `const typename object_t::key_type& key`.*
+
+- Changed:
+ ```diff
+ - template size_type count(KeyT&&
+ + size_type count(const typename object_t::key_type&
+ key) const
+ ```
+
+### [`nlohmann::basic_json::default_object_comparator_t`](../api/basic_json/default_object_comparator_t.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using default_object_comparator_t = std::less<>
+ ```
+
+### [`nlohmann::basic_json::find`](../api/basic_json/find.md)
+
+*Changes parameter `KeyT&& key` to `const typename object_t::key_type& key`.*
+
+- Changed:
+ ```diff
+ - template const_iterator find(KeyT&&
+ + const_iterator find(const typename object_t::key_type&
+ key) const
+ ```
+
+### [`nlohmann::basic_json::from_bjdata`](../api/basic_json/from_bjdata.md)
+
+*New addition to the public API.*
+
+- New symbols (2 overloads).
+ ```cpp
+ template JSON_HEDLEY_WARN_UNUSED_RESULT static basic_json from_bjdata(InputType&& i, const bool strict = true, const bool allow_exceptions = true)
+ ```
+ ```cpp
+ template JSON_HEDLEY_WARN_UNUSED_RESULT static basic_json from_bjdata(IteratorType first, IteratorType last, const bool strict = true, const bool allow_exceptions = true)
+ ```
+
+### [`nlohmann::basic_json::json_pointer`](../api/json_pointer.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ using json_pointer =
+ - ::nlohmann::json_pointer
+ + ::nlohmann::json_pointer
+ ```
+
+### [`nlohmann::basic_json::object_comparator_t`](../api/basic_json/object_comparator_t.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ using object_comparator_t =
+ - std::less<>
+ + detail::actual_object_comparator_t
+ ```
+
+### [`nlohmann::basic_json::object_t`](../api/basic_json/object_t.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ using object_t = ObjectType>>
+ ```
+
+### [`nlohmann::basic_json::operator ValueType`](../api/basic_json/operator_ValueType.md)
+
+*Adjusts the template constraints (SFINAE) controlling which types this overload participates in overload resolution for.*
+
+- Changed:
+ ```diff
+ template < typename ValueType, typename std::enable_if < detail::conjunction < detail::negation>, detail::negation>>, detail::negation>, detail::negation>, detail::negation>, detail::negation>>, detail::negation>, detail::negatio
+ #endif detail::is_detected_lazy >::value, int >::type = 0 > JSON_EXPLICIT operator ValueType() const
+ ```
+
+### [`nlohmann::basic_json::patch_inplace`](../api/basic_json/patch.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ void patch_inplace(const basic_json& json_patch)
+ ```
+
+### [`nlohmann::basic_json::to_bjdata`](../api/basic_json/to_bjdata.md)
+
+*New addition to the public API.*
+
+- New symbols (3 overloads).
+ ```cpp
+ static std::vector to_bjdata(const basic_json& j, const bool use_size = false, const bool use_type = false)
+ ```
+ ```cpp
+ static void to_bjdata(const basic_json& j, detail::output_adapter o, const bool use_size = false, const bool use_type = false)
+ ```
+ ```cpp
+ static void to_bjdata(const basic_json& j, detail::output_adapter o, const bool use_size = false, const bool use_type = false)
+ ```
+
+### [`nlohmann::json_pointer::back`](../api/json_pointer/back.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ const
+ - std::string&
+ + string_t&
+ back() const
+ ```
+
+### [`nlohmann::json_pointer::json_pointer`](../api/json_pointer/json_pointer.md)
+
+*Changes parameter `const std::string& s = ""` to `const string_t& s = ""`.*
+
+- Changed:
+ ```diff
+ explicit json_pointer(const
+ - std::string&
+ + string_t&
+ s = "")
+ ```
+
+### `nlohmann::json_pointer::operator basic_string`
+
+*Removed from the public API.*
+
+- Removes 1 overload.
+ ```cpp
+ operator std::string() const
+ ```
+
+### [`nlohmann::json_pointer::operator nlohmann::json_pointer::string_t_helper::type`](../api/json_pointer/operator_string.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ JSON_HEDLEY_DEPRECATED_FOR(3.11.0, to_string()) operator string_t() const
+ ```
+
+### [`nlohmann::json_pointer::push_back`](../api/json_pointer/push_back.md)
+
+*Changes parameter `const std::string& token` to `const string_t& token`.*
+
+- Changed:
+ ```diff
+ void push_back(const
+ - std::string&
+ + string_t&
+ token)
+ ```
+
+### [`nlohmann::json_pointer::string_t`](../api/json_pointer/string_t.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using string_t = typename string_t_helper::type
+ ```
+
+### [`nlohmann::json_pointer::to_string`](../api/json_pointer/to_string.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ - std::string
+ + string_t
+ to_string() const
+ ```
+
+### [`nlohmann::ordered_map::at`](../api/ordered_map/at.md)
+
+*Changes parameter `const Key& key` to `const key_type& key`.*
+
+- Changed:
+ ```diff
+ T& at(const
+ - Key&
+ + key_type&
+ key)
+ ```
+
+### [`nlohmann::ordered_map::count`](../api/ordered_map/count.md)
+
+*Changes parameter `const Key& key` to `const key_type& key`.*
+
+- Changed:
+ ```diff
+ size_type count(const
+ - Key&
+ + key_type&
+ key) const
+ ```
+
+### [`nlohmann::ordered_map::emplace`](../api/ordered_map/emplace.md)
+
+*Adds a new overload.*
+
+- Adds 1 new overload.
+ ```cpp
+ template::value, int> = 0> std::pair emplace(KeyType && key, T && t)
+ ```
+
+### [`nlohmann::ordered_map::find`](../api/ordered_map/find.md)
+
+*Changes parameter `const Key& key` to `const key_type& key`.*
+
+- Changed:
+ ```diff
+ const_iterator find(const
+ - Key&
+ + key_type&
+ key) const
+ ```
+
+### [`nlohmann::ordered_map::key_compare`](../api/ordered_map/key_compare.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using key_compare = std::equal_to<>
+ ```
+
+### [`nlohmann::ordered_map::operator[]`](../api/ordered_map/operator[].md)
+
+*Changes parameter `const Key& key` to `const key_type& key`.*
+
+- Changed:
+ ```diff
+ T& operator[](const
+ - Key&
+ + key_type&
+ key)
+ ```
+
+### [`nlohmann::ordered_map::ordered_map`](../api/ordered_map/ordered_map.md)
+
+*Changes parameter `const Allocator& alloc = Allocator()` to `const Allocator& alloc`.*
+
+- Changed:
+ ```diff
+ - ordered_map(const Allocator& alloc = Allocator())
+ + explicit ordered_map(const Allocator& alloc) noexcept(noexcept(Container(alloc)))
+ ```
+
+**Cosmetic-only changes** (no behavioral/contract difference; omitted above): `nlohmann::basic_json::contains`, `nlohmann::basic_json::erase`, `nlohmann::basic_json::operator[]`, `nlohmann::basic_json::value`, `nlohmann::json_pointer::operator/=`, `nlohmann::operator/`, `nlohmann::ordered_map::erase`.
+
+## 3.10.5
+
+### [`nlohmann::basic_json::update`](../api/basic_json/update.md)
+
+*Adds an optional `bool merge_objects` parameter (default `false`).*
+
+- Changed:
+ ```diff
+ void update(const_iterator first, const_iterator
+ - last)
+ + last, bool merge_objects = false)
+ ```
+
+### `nlohmann::ordered_map::const_iterator`
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using const_iterator = typename Container::const_iterator
+ ```
+
+### [`nlohmann::ordered_map::erase`](../api/ordered_map/erase.md)
+
+*Adds a new overload.*
+
+- Adds 1 new overload.
+ ```cpp
+ iterator erase(iterator first, iterator last)
+ ```
+
+### `nlohmann::ordered_map::iterator`
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using iterator = typename Container::iterator
+ ```
+
+### `nlohmann::ordered_map::size_type`
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using size_type = typename Container::size_type
+ ```
+
+### `nlohmann::ordered_map::value_type`
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using value_type = typename Container::value_type
+ ```
+
+**Cosmetic-only changes** (no behavioral/contract difference; omitted above): `nlohmann::operator/`.
+
+## 3.10.0
+
+### [`nlohmann::operator<`](../api/basic_json/operator_lt.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ friend bool operator<(const_reference lhs, const_reference rhs) noexcept { const auto lhs_type = lhs.type(); const auto rhs_type = rhs.type(); if (lhs_type == rhs_type) { switch (l
+ + case value_t::discarded:
+ default: return false; } } else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) { return static_cast(lhs.m_value.number_integer) < rhs
+ ```
+
+### [`nlohmann::adl_serializer::from_json`](../api/adl_serializer/from_json.md)
+
+*Removes a parameter from the signature.*
+
+- Changed:
+ ```diff
+ template static auto from_json(BasicJsonType&& j, ValueType& val) noexcept( noexcept(::nlohmann::from_json(std::forward(j), val))) -> decltype(::nlohmann::from_jso
+ + TargetType = ValueType> static auto from_json(BasicJsonType && j) noexcept( noexcept(::nlohmann::from_json(std::forward(j), detail::identity_tag {}))) ->
+ ```
+
+### [`nlohmann::adl_serializer::to_json`](../api/adl_serializer/to_json.md)
+
+*Changes parameter `ValueType&& val` to `TargetType && val`.*
+
+- Changed:
+ ```diff
+ template static auto to_json(BasicJsonType& j, ValueType&& val) noexcept( noexcept(::nlohmann::to_json(j, std::forward(val)))) -> decltype(::nlohmann::to_json(j, std::
+ + TargetType = ValueType> static auto to_json(BasicJsonType& j, TargetType && val) noexcept( noexcept(::nlohmann::to_json(j, std::forward(val)))) -> decltype(::nlohmann::
+ void())
+ ```
+
+### [`nlohmann::basic_json::get`](../api/basic_json/get.md)
+
+*Adds a new `JSON_HAS_CPP_14` parameter.*
+
+- Changed:
+ ```diff
+ template < typename
+ - BasicJsonType, detail::enable_if_t < !std::is_same::value&& detail::is_basic_json::value, int > = 0 > BasicJsonType get() const
+ + ValueTypeCV, typename ValueType = detail::uncvref_t> #if defined(JSON_HAS_CPP_14) constexpr #endif auto get() const noexcept( noexcept(std::declval::value&& !std::is_same>::value&& !std::is_same::value&& !detail::is_ba
+ + detail::conjunction < detail::negation>, detail::negation>>, detail::negation::type = 0 > JSON_EXPLICIT operator ValueType() const
+ ```
+
+### [`nlohmann::basic_json::to_bson`](../api/basic_json/to_bson.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ static
+ - std::vector
+ + std::vector
+ to_bson(const basic_json& j)
+ ```
+
+### [`nlohmann::basic_json::to_cbor`](../api/basic_json/to_cbor.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ static
+ - std::vector
+ + std::vector
+ to_cbor(const basic_json& j)
+ ```
+
+### [`nlohmann::basic_json::to_msgpack`](../api/basic_json/to_msgpack.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ static
+ - std::vector
+ + std::vector
+ to_msgpack(const basic_json& j)
+ ```
+
+### [`nlohmann::basic_json::to_ubjson`](../api/basic_json/to_ubjson.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ static
+ - std::vector
+ + std::vector
+ to_ubjson(const basic_json& j, const bool use_size = false, const bool use_type = false)
+ ```
+
+### [`nlohmann::byte_container_with_subtype::set_subtype`](../api/byte_container_with_subtype/set_subtype.md)
+
+*Changes parameter `std::uint8_t subtype` to `subtype_type subtype_`.*
+
+- Changed:
+ ```diff
+ void
+ - set_subtype(std::uint8_t subtype)
+ + set_subtype(subtype_type subtype_)
+ noexcept
+ ```
+
+### [`nlohmann::byte_container_with_subtype::subtype`](../api/byte_container_with_subtype/subtype.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ constexpr
+ - std::uint8_t
+ + subtype_type
+ subtype() const noexcept
+ ```
+
+### [`nlohmann::byte_container_with_subtype::subtype_type`](../api/byte_container_with_subtype/subtype_type.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using subtype_type = std::uint64_t
+ ```
+
+### [`nlohmann::json_sax::json_sax`](../api/json_sax/json_sax.md)
+
+*New addition to the public API.*
+
+- New symbols (3 overloads).
+ ```cpp
+ json_sax() = default
+ ```
+ ```cpp
+ json_sax(const json_sax&) = default
+ ```
+ ```cpp
+ json_sax(json_sax&&) noexcept = default
+ ```
+
+### [`nlohmann::json_sax::operator=`](../api/json_sax/operator=.md)
+
+*New addition to the public API.*
+
+- New symbols (2 overloads).
+ ```cpp
+ json_sax& operator=(const json_sax&) = default
+ ```
+ ```cpp
+ json_sax& operator=(json_sax&&) noexcept = default
+ ```
+
+### [`nlohmann::ordered_map::insert`](../api/ordered_map/insert.md)
+
+*Adds a new overload.*
+
+- Adds 1 new overload.
+ ```cpp
+ template> void insert(InputIt first, InputIt last)
+ ```
+
+**Cosmetic-only changes** (no behavioral/contract difference; omitted above): `nlohmann::basic_json::binary`, `nlohmann::byte_container_with_subtype::byte_container_with_subtype`.
+
+## 3.9.1
+
+### [`nlohmann::ordered_map::at`](../api/ordered_map/at.md)
+
+*New addition to the public API.*
+
+- New symbols (2 overloads).
+ ```cpp
+ T& at(const Key& key)
+ ```
+ ```cpp
+ const T& at(const Key& key) const
+ ```
+
+### [`nlohmann::ordered_map::count`](../api/ordered_map/count.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ size_type count(const Key& key) const
+ ```
+
+### [`nlohmann::ordered_map::emplace`](../api/ordered_map/emplace.md)
+
+*Changes parameter `key_type&& key` to `const key_type& key`.*
+
+- Changed:
+ ```diff
+ std::pair
+ - emplace(key_type&&
+ + emplace(const key_type&
+ key, T&& t)
+ ```
+
+### [`nlohmann::ordered_map::erase`](../api/ordered_map/erase.md)
+
+*Adds a new overload.*
+
+- Adds 1 new overload.
+ ```cpp
+ iterator erase(iterator pos)
+ ```
+
+### [`nlohmann::ordered_map::find`](../api/ordered_map/find.md)
+
+*New addition to the public API.*
+
+- New symbols (2 overloads).
+ ```cpp
+ const_iterator find(const Key& key) const
+ ```
+ ```cpp
+ iterator find(const Key& key)
+ ```
+
+### [`nlohmann::ordered_map::insert`](../api/ordered_map/insert.md)
+
+*New addition to the public API.*
+
+- New symbols (2 overloads).
+ ```cpp
+ std::pair insert( const value_type& value )
+ ```
+ ```cpp
+ std::pair insert( value_type&& value )
+ ```
+
+### [`nlohmann::ordered_map::operator[]`](../api/ordered_map/operator[].md)
+
+*Changes parameter `Key&& key` to `const Key& key`.*
+
+- Changed:
+ ```diff
+ T&
+ - operator[](Key&&
+ + operator[](const Key&
+ key)
+ ```
+
+## 3.9.0
+
+### [`nlohmann::operator<`](../api/basic_json/operator_lt.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ friend bool operator<(const_reference lhs, const_reference rhs) noexcept { const auto lhs_type = lhs.type(); const auto rhs_type = rhs.type(); if (lhs_type == rhs_type) { switch (l
+ - and rhs_type == value_t::number_float) { return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; } else if (lhs_type == value_t::number_float and
+ + && rhs_type == value_t::number_float) { return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; } else if (lhs_type == value_t::number_float && r
+ rhs_type == value_t::number_integer) { return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; } return operator<(lhs_type, rhs_type); }
+ ```
+
+### [`nlohmann::operator<=`](../api/basic_json/operator_le.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ friend bool operator<=(const_reference lhs, const_reference rhs) noexcept { return
+ - not (rhs
+ + !(rhs
+ < lhs); }
+ ```
+
+### [`nlohmann::swap`](../api/basic_json/swap.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ friend void swap(reference left, reference right) noexcept ( std::is_nothrow_move_constructible::value&& std::is_nothrow_move_assignable::value&& std::is_nothrow_move_constructible::value&& [...]
+ ```
+
+### [`nlohmann::adl_serializer::to_json`](../api/adl_serializer/to_json.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ - template static auto to_json(BasicJsonType& j, ValueType&& val) noexcept( noexcept(::nlohmann::to_json(j, std::forward(val)))) -> decltype(::nl
+ ```
+
+### [`nlohmann::basic_json::accept`](../api/basic_json/accept.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len)) static bool accept(detail::span_input_adapter&&
+ - i)
+ + i, const bool ignore_comments = false)
+ ```
+
+### [`nlohmann::basic_json::cbor_tag_handler_t`](../api/basic_json/cbor_tag_handler_t.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using cbor_tag_handler_t = detail::cbor_tag_handler_t
+ ```
+
+### [`nlohmann::basic_json::from_cbor`](../api/basic_json/from_cbor.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) static basic_json from_cbor(detail::span_input_adapter&& i, const bool strict = true, co
+ - true)
+ + true, const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)
+ ```
+
+### [`nlohmann::basic_json::get`](../api/basic_json/get.md)
+
+*Adjusts the template constraints (SFINAE) controlling which types this overload participates in overload resolution for.*
+
+- Changed:
+ ```diff
+ - template::value and detail::is_basic_json::value, int> = 0>
+ + template < typename BasicJsonType, detail::enable_if_t < !std::is_same::value&& detail::is_basic_json::value, int > = 0 >
+ BasicJsonType get() const
+ ```
+
+### [`nlohmann::basic_json::get_ptr`](../api/basic_json/get_ptr.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ - template::value and std::is_const::type>::value, int>::type =
+ + template < typename PointerType, typename std::enable_if < std::is_pointer::value&& std::is_const::type>::value, int >::type
+ constexpr auto get_ptr() const noexcept -> decltype(std::declval().get_impl_ptr(std::declval()))
+ ```
+
+### [`nlohmann::basic_json::get_ref`](../api/basic_json/get_ref.md)
+
+*Adjusts the template constraints (SFINAE) controlling which types this overload participates in overload resolution for.*
+
+- Changed:
+ ```diff
+ - template::value and std::is_const::type>::value, int
+ + template < typename ReferenceType, typename std::enable_if < std::is_reference::value&& std::is_const::type>::value, in
+ ReferenceType get_ref() const
+ ```
+
+### [`nlohmann::basic_json::operator ValueType`](../api/basic_json/operator_ValueType.md)
+
+*Adjusts the template constraints (SFINAE) controlling which types this overload participates in overload resolution for.*
+
+- Changed:
+ ```diff
+ template < typename ValueType, typename std::enable_if <
+ - not std::is_pointer::value and not std::is_same>::value and not std::is_same::value and
+ + !std::is_pointer::value&& !std::is_same>::value&& !std::is_same::value&& !detail::is_ba
+ operator ValueType() const
+ ```
+
+### [`nlohmann::basic_json::operator=`](../api/basic_json/operator=.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ basic_json& operator=(basic_json other) noexcept (
+ - std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and std::is_nothrow_move_constructible::value and
+ + std::is_nothrow_move_constructible::value&& std::is_nothrow_move_assignable::value&& std::is_nothrow_move_constructible::value&&
+ std::is_nothrow_move_assignable::value )
+ ```
+
+### [`nlohmann::basic_json::parse`](../api/basic_json/parse.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len)) static basic_json parse(detail::span_input_adapter&& i, const parser_callback_t cb = nullptr
+ - true)
+ + true, const bool ignore_comments = false)
+ ```
+
+### [`nlohmann::basic_json::sax_parse`](../api/basic_json/sax_parse.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ template JSON_HEDLEY_NON_NULL(2) static bool sax_parse(InputType&& i, SAX* sax, input_format_t format = input_format_t::json, const bool strict =
+ - true)
+ + true, const bool ignore_comments = false)
+ ```
+
+### [`nlohmann::ordered_map::Container`](../api/ordered_map/Container.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using Container = std::vector, Allocator>
+ ```
+
+### [`nlohmann::ordered_map::emplace`](../api/ordered_map/emplace.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ std::pair emplace(key_type&& key, T&& t)
+ ```
+
+### [`nlohmann::ordered_map::erase`](../api/ordered_map/erase.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ size_type erase(const Key& key)
+ ```
+
+### `nlohmann::ordered_map::key_type`
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using key_type = Key
+ ```
+
+### `nlohmann::ordered_map::mapped_type`
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using mapped_type = T
+ ```
+
+### [`nlohmann::ordered_map::operator[]`](../api/ordered_map/operator[].md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ T& operator[](Key&& key)
+ ```
+
+### [`nlohmann::ordered_map::ordered_map`](../api/ordered_map/ordered_map.md)
+
+*New addition to the public API.*
+
+- New symbols (3 overloads).
+ ```cpp
+ ordered_map(const Allocator& alloc = Allocator())
+ ```
+ ```cpp
+ ordered_map(std::initializer_list init, const Allocator& alloc = Allocator() )
+ ```
+ ```cpp
+ template ordered_map(It first, It last, const Allocator& alloc = Allocator())
+ ```
+
+**Cosmetic-only changes** (no behavioral/contract difference; omitted above): `nlohmann::basic_json::basic_json`, `nlohmann::basic_json::contains`, `nlohmann::basic_json::erase`, `nlohmann::basic_json::get_to`, `nlohmann::basic_json::swap`, `nlohmann::basic_json::value`.
+
+## 3.8.0
+
+### [`nlohmann::operator<`](../api/basic_json/operator_lt.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ friend bool operator<(const_reference lhs, const_reference rhs) noexcept { const auto lhs_type = lhs.type(); const auto rhs_type = rhs.type(); if (lhs_type == rhs_type) { switch (l
+ + case value_t::binary: return (*lhs.m_value.binary) < (*rhs.m_value.binary);
+ default: return false; } } else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float) { return static_cast(lhs.m_value.number_integer) < rh
+ ```
+
+### [`nlohmann::operator<<`](../api/basic_json/operator_gtgt.md)
+
+*Adds a new `operator>>(std::istream&, basic_json&)` parameter.*
+
+- Changed:
+ ```diff
+ - JSON_HEDLEY_DEPRECATED(3.0.0)
+ + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&))
+ friend std::istream& operator<<(basic_json& j, std::istream& i) { return operator>>(i, j);
+ ```
+
+### [`nlohmann::operator>>`](../api/basic_json/operator_ltlt.md)
+
+*Adds a new `operator<<(std::ostream&, const basic_json&)` parameter.*
+
+- Changed:
+ ```diff
+ - JSON_HEDLEY_DEPRECATED(3.0.0)
+ + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&))
+ friend std::ostream& operator>>(const basic_json& j, std::ostream& o)
+ ```
+
+### [`nlohmann::basic_json::accept`](../api/basic_json/accept.md)
+
+*Changes the parameter list.*
+
+- Changed:
+ ```diff
+ - static bool accept(detail::input_adapter&&
+ + JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len)) static bool accept(detail::span_input_adapter&&
+ i)
+ ```
+
+### [`nlohmann::basic_json::basic_json`](../api/basic_json/basic_json.md)
+
+- Adds 1 new overload.
+ ```cpp
+ template , std::is_same>::value, int> = 0 > basic_json(const JsonRef& ref)
+ ```
+- Removes 1 overload.
+ ```cpp
+ basic_json(const detail::json_ref& ref)
+ ```
+
+### [`nlohmann::basic_json::binary`](../api/basic_json/binary.md)
+
+*New addition to the public API.*
+
+- New symbols (4 overloads).
+ ```cpp
+ JSON_HEDLEY_WARN_UNUSED_RESULT static basic_json binary(const typename binary_t::container_type& init)
+ ```
+ ```cpp
+ JSON_HEDLEY_WARN_UNUSED_RESULT static basic_json binary(const typename binary_t::container_type& init, std::uint8_t subtype)
+ ```
+ ```cpp
+ JSON_HEDLEY_WARN_UNUSED_RESULT static basic_json binary(typename binary_t::container_type&& init)
+ ```
+ ```cpp
+ JSON_HEDLEY_WARN_UNUSED_RESULT static basic_json binary(typename binary_t::container_type&& init, std::uint8_t subtype)
+ ```
+
+### [`nlohmann::basic_json::binary_t`](../api/basic_json/binary_t.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using binary_t = nlohmann::byte_container_with_subtype
+ ```
+
+### [`nlohmann::basic_json::from_bson`](../api/basic_json/from_bson.md)
+
+*Removes a parameter from the signature.*
+
+- Changed:
+ ```diff
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ - static basic_json from_bson(detail::input_adapter&&
+ + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) static basic_json from_bson(detail::span_input_adapter&&
+ i, const bool strict = true, const bool allow_exceptions = true)
+ ```
+
+### [`nlohmann::basic_json::from_cbor`](../api/basic_json/from_cbor.md)
+
+*Removes a parameter from the signature.*
+
+- Changed:
+ ```diff
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ - static basic_json from_cbor(detail::input_adapter&&
+ + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) static basic_json from_cbor(detail::span_input_adapter&&
+ i, const bool strict = true, const bool allow_exceptions = true)
+ ```
+
+### [`nlohmann::basic_json::from_msgpack`](../api/basic_json/from_msgpack.md)
+
+*Removes a parameter from the signature.*
+
+- Changed:
+ ```diff
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ - static basic_json from_msgpack(detail::input_adapter&&
+ + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) static basic_json from_msgpack(detail::span_input_adapter&&
+ i, const bool strict = true, const bool allow_exceptions = true)
+ ```
+
+### [`nlohmann::basic_json::from_ubjson`](../api/basic_json/from_ubjson.md)
+
+*Removes a parameter from the signature.*
+
+- Changed:
+ ```diff
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ - static basic_json from_ubjson(detail::input_adapter&&
+ + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) static basic_json from_ubjson(detail::span_input_adapter&&
+ i, const bool strict = true, const bool allow_exceptions = true)
+ ```
+
+### [`nlohmann::basic_json::get_binary`](../api/basic_json/get_binary.md)
+
+*New addition to the public API.*
+
+- New symbols (2 overloads).
+ ```cpp
+ binary_t& get_binary()
+ ```
+ ```cpp
+ const binary_t& get_binary() const
+ ```
+
+### [`nlohmann::basic_json::is_binary`](../api/basic_json/is_binary.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ constexpr bool is_binary() const noexcept
+ ```
+
+### [`nlohmann::basic_json::iterator_wrapper`](../api/basic_json/items.md)
+
+*Adds a new `items()` parameter.*
+
+- Changed:
+ ```diff
+ - JSON_HEDLEY_DEPRECATED(3.1.0)
+ + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())
+ static iteration_proxy iterator_wrapper(const_reference ref) noexcept
+ ```
+
+### [`nlohmann::basic_json::operator ValueType`](../api/basic_json/operator_ValueType.md)
+
+*Adjusts the template constraints (SFINAE) controlling which types this overload participates in overload resolution for.*
+
+- Changed:
+ ```diff
+ template < typename ValueType, typename std::enable_if < not std::is_pointer::value and not std::is_same>::value and not std::is_
+ - #ifndef _MSC_VER and not std::is_same>::value #if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VE
+ + and not std::is_same>::value #if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) and _MSC_VER >
+ ```
+
+### [`nlohmann::basic_json::parse`](../api/basic_json/parse.md)
+
+*Removes a parameter from the signature.*
+
+- Changed:
+ ```diff
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ - static basic_json parse(detail::input_adapter&&
+ + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len)) static basic_json parse(detail::span_input_adapter&&
+ i, const parser_callback_t cb = nullptr, const bool allow_exceptions = true)
+ ```
+
+### [`nlohmann::basic_json::parse_event_t`](../api/basic_json/parse_event_t.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ using parse_event_t =
+ - typename parser::parse_event_t
+ + detail::parse_event_t
+ ```
+
+### [`nlohmann::basic_json::parser_callback_t`](../api/basic_json/parser_callback_t.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ using parser_callback_t =
+ - typename parser::parser_callback_t
+ + detail::parser_callback_t
+ ```
+
+### [`nlohmann::basic_json::sax_parse`](../api/basic_json/sax_parse.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ template JSON_HEDLEY_NON_NULL(2) static bool sax_parse(detail::input_adapter&&
+ + InputType, typename SAX> JSON_HEDLEY_NON_NULL(2) static bool sax_parse(InputType&&
+ i, SAX* sax, input_format_t format = input_format_t::json, const bool strict = true)
+ ```
+
+### [`nlohmann::basic_json::swap`](../api/basic_json/swap.md)
+
+*Adds 2 new overloads.*
+
+- Adds 2 new overloads.
+ ```cpp
+ void swap(binary_t& other)
+ ```
+ ```cpp
+ void swap(typename binary_t::container_type& other)
+ ```
+
+### [`nlohmann::byte_container_with_subtype::byte_container_with_subtype`](../api/byte_container_with_subtype/byte_container_with_subtype.md)
+
+*New addition to the public API.*
+
+- New symbols (5 overloads).
+ ```cpp
+ byte_container_with_subtype() noexcept(noexcept(container_type()))
+ ```
+ ```cpp
+ byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b)))
+ ```
+ ```cpp
+ byte_container_with_subtype(const container_type& b, std::uint8_t subtype) noexcept(noexcept(container_type(b)))
+ ```
+ ```cpp
+ byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b))))
+ ```
+
+### [`nlohmann::byte_container_with_subtype::clear_subtype`](../api/byte_container_with_subtype/clear_subtype.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ void clear_subtype() noexcept
+ ```
+
+### [`nlohmann::byte_container_with_subtype::container_type`](../api/byte_container_with_subtype/container_type.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using container_type = BinaryType
+ ```
+
+### [`nlohmann::byte_container_with_subtype::has_subtype`](../api/byte_container_with_subtype/has_subtype.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ constexpr bool has_subtype() const noexcept
+ ```
+
+### [`nlohmann::byte_container_with_subtype::operator!=`](../api/byte_container_with_subtype/operator_ne.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ bool operator!=(const byte_container_with_subtype& rhs) const
+ ```
+
+### [`nlohmann::byte_container_with_subtype::operator==`](../api/byte_container_with_subtype/operator_eq.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ bool operator==(const byte_container_with_subtype& rhs) const
+ ```
+
+### [`nlohmann::byte_container_with_subtype::set_subtype`](../api/byte_container_with_subtype/set_subtype.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ void set_subtype(std::uint8_t subtype) noexcept
+ ```
+
+### [`nlohmann::byte_container_with_subtype::subtype`](../api/byte_container_with_subtype/subtype.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ constexpr std::uint8_t subtype() const noexcept
+ ```
+
+### [`nlohmann::json_sax::binary`](../api/json_sax/binary.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ virtual bool binary(binary_t& val) = 0
+ ```
+
+### [`nlohmann::json_sax::binary_t`](../api/json_sax/binary_t.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using binary_t = typename BasicJsonType::binary_t
+ ```
+
+**Cosmetic-only changes** (no behavioral/contract difference; omitted above): `nlohmann::basic_json::value`, `nlohmann::json_pointer::operator/=`, `nlohmann::operator/`.
+
+## 3.7.1
+
+**Cosmetic-only changes** (no behavioral/contract difference; omitted above): `nlohmann::basic_json::contains`, `nlohmann::basic_json::get`, `nlohmann::json_pointer::back`.
+
+## 3.7.0
+
+### [`nlohmann::operator<`](../api/basic_json/operator_lt.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ friend bool operator<(const_reference lhs, const_reference rhs) noexcept { const auto lhs_type = lhs.type(); const auto rhs_type = rhs.type(); if (lhs_type == rhs_type) { switch (l
+ - *lhs.m_value.object < *rhs.m_value.object; case value_t::null: return false; case value_t::string: return *lhs.m_value.string < *rhs.m_value.string; case value_t::boolean: return l
+ + (*lhs.m_value.object) < (*rhs.m_value.object); case value_t::null: return false; case value_t::string: return (*lhs.m_value.string) < (*rhs.m_value.string); case value_t::boolean:
+ default: return false; } } else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float) { return static_cast(lhs.m_value.number_integer) < rh
+ ```
+
+### [`nlohmann::basic_json::contains`](../api/basic_json/contains.md)
+
+*Changes parameter `KeyT&& key` to `const json_pointer& ptr`.*
+
+- Changed:
+ ```diff
+ - template bool contains(KeyT&& key)
+ + bool contains(const json_pointer& ptr)
+ const
+ ```
+
+### [`nlohmann::basic_json::emplace_back`](../api/basic_json/emplace_back.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ template
+ - void
+ + reference
+ emplace_back(Args&& ... args)
+ ```
+
+### [`nlohmann::basic_json::get_to`](../api/basic_json/get_to.md)
+
+*Adds a new overload.*
+
+- Adds 1 new overload.
+ ```cpp
+ template < typename T, std::size_t N, typename Array = T (&)[N], detail::enable_if_t < detail::has_from_json::value, int > = 0 > Array get_to(T (&v)[N]) const noexcept(noexcept(JSONSerializer: [...]
+ ```
+
+**Cosmetic-only changes** (no behavioral/contract difference; omitted above): `nlohmann::basic_json::array`, `nlohmann::basic_json::diff`, `nlohmann::basic_json::from_bson`, `nlohmann::basic_json::from_cbor`, `nlohmann::basic_json::from_msgpack`, `nlohmann::basic_json::from_ubjson`, `nlohmann::basic_json::iterator_wrapper`, `nlohmann::basic_json::meta`, `nlohmann::basic_json::object`, `nlohmann::basic_json::operator[]`, `nlohmann::basic_json::parse`, `nlohmann::basic_json::sax_parse`, `nlohmann::basic_json::type_name`, `nlohmann::basic_json::value`, `nlohmann::operator<<`, `nlohmann::operator>>`.
+
+## 3.6.1
+
+### [`nlohmann::operator<`](../api/basic_json/operator_lt.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ friend bool operator<(const_reference lhs, const_reference rhs) noexcept { const auto lhs_type = lhs.type(); const auto rhs_type = rhs.type(); if (lhs_type == rhs_type) { switch (l
+ - *lhs.m_value.array < *rhs.m_value.array;
+ + (*lhs.m_value.array) < (*rhs.m_value.array);
+ case value_t::object: return *lhs.m_value.object < *rhs.m_value.object; case value_t::null: return false; case value_t::string: return *lhs.m_value.string < *rhs.m_value.string; ca
+ ```
+
+## 3.6.0
+
+### [`nlohmann::operator/`](../api/json_pointer/operator_slash.md)
+
+*New addition to the public API.*
+
+- New symbols (3 overloads).
+ ```cpp
+ friend json_pointer operator/(const json_pointer& lhs, const json_pointer& rhs)
+ ```
+ ```cpp
+ friend json_pointer operator/(const json_pointer& ptr, std::size_t array_index)
+ ```
+ ```cpp
+ friend json_pointer operator/(const json_pointer& ptr, std::string token)
+ ```
+
+### [`nlohmann::operator<`](../api/basic_json/operator_lt.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ friend bool operator<(const_reference lhs, const_reference rhs) noexcept { const auto lhs_type = lhs.type(); const auto rhs_type = rhs.type(); if (lhs_type == rhs_type) { switch (l
+ - (*lhs.m_value.array) < (*rhs.m_value.array);
+ + *lhs.m_value.array < *rhs.m_value.array;
+ case value_t::object: return *lhs.m_value.object < *rhs.m_value.object; case value_t::null: return false; case value_t::string: return *lhs.m_value.string < *rhs.m_value.string; ca
+ ```
+
+### [`nlohmann::basic_json::contains`](../api/basic_json/contains.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ template bool contains(KeyT&& key) const
+ ```
+
+### [`nlohmann::basic_json::operator ValueType`](../api/basic_json/operator_ValueType.md)
+
+*Changes the declaration; see the signature diff for details.*
+
+- Changed:
+ ```diff
+ template < typename ValueType, typename std::enable_if < not std::is_pointer::value and not std::is_same>::value and not std::is_
+ - defined(_MSC_VER) and _MSC_VER <= 1914
+ + (defined(__GNUC__) || (defined(_MSC_VER) and _MSC_VER <= 1914))
+ and not std::is_same::value #endif #endif and detail::is_detected::value , int
+ ```
+
+### `nlohmann::json_pointer::array_index`
+
+*Removed from the public API.*
+
+- Removes 1 overload.
+ ```cpp
+ static int array_index(const std::string& s)
+ ```
+
+### [`nlohmann::json_pointer::back`](../api/json_pointer/back.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ const std::string& back()
+ ```
+
+### [`nlohmann::json_pointer::empty`](../api/json_pointer/empty.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ bool empty() const noexcept
+ ```
+
+### [`nlohmann::json_pointer::operator/=`](../api/json_pointer/operator_slasheq.md)
+
+*New addition to the public API.*
+
+- New symbols (3 overloads).
+ ```cpp
+ json_pointer& operator/=(const json_pointer& ptr)
+ ```
+ ```cpp
+ json_pointer& operator/=(std::size_t array_index)
+ ```
+ ```cpp
+ json_pointer& operator/=(std::string token)
+ ```
+
+### [`nlohmann::json_pointer::parent_pointer`](../api/json_pointer/parent_pointer.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ json_pointer parent_pointer() const
+ ```
+
+### [`nlohmann::json_pointer::pop_back`](../api/json_pointer/pop_back.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ void pop_back()
+ ```
+
+### [`nlohmann::json_pointer::push_back`](../api/json_pointer/push_back.md)
+
+*New addition to the public API.*
+
+- New symbols (2 overloads).
+ ```cpp
+ void push_back(const std::string& token)
+ ```
+ ```cpp
+ void push_back(std::string&& token)
+ ```
+
+**Cosmetic-only changes** (no behavioral/contract difference; omitted above): `nlohmann::basic_json::array`, `nlohmann::basic_json::diff`, `nlohmann::basic_json::from_bson`, `nlohmann::basic_json::from_cbor`, `nlohmann::basic_json::from_msgpack`, `nlohmann::basic_json::from_ubjson`, `nlohmann::basic_json::meta`, `nlohmann::basic_json::object`, `nlohmann::basic_json::parse`, `nlohmann::operator<<`.
+
+## 3.5.0
+
+### [`nlohmann::basic_json::merge_patch`](../api/basic_json/merge_patch.md)
+
+*Changes parameter `const basic_json& patch` to `const basic_json& apply_patch`.*
+
+- Changed:
+ ```diff
+ void merge_patch(const basic_json&
+ - patch)
+ + apply_patch)
+ ```
+
+## 3.4.0
+
+### [`nlohmann::adl_serializer::from_json`](../api/adl_serializer/from_json.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ template static auto from_json(BasicJsonType&& j, ValueType& val) noexcept( noexcept(::nlohmann::from_json(std::forward(j
+ - decltype( ::nlohmann::from_json(std::forward(j), val), void() )
+ + decltype(::nlohmann::from_json(std::forward(j), val), void())
+ ```
+
+### [`nlohmann::basic_json::dump`](../api/basic_json/dump.md)
+
+*Adds an optional `const error_handler_t error_handler` parameter (default `error_handler_t::strict`).*
+
+- Changed:
+ ```diff
+ string_t dump(const int indent = -1, const char indent_char = ' ', const bool ensure_ascii =
+ - false)
+ + false, const error_handler_t error_handler = error_handler_t::strict)
+ const
+ ```
+
+### [`nlohmann::basic_json::error_handler_t`](../api/basic_json/error_handler_t.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ using error_handler_t = detail::error_handler_t
+ ```
+
+### [`nlohmann::basic_json::from_bson`](../api/basic_json/from_bson.md)
+
+*New addition to the public API.*
+
+- New symbols (2 overloads).
+ ```cpp
+ static basic_json from_bson(detail::input_adapter&& i, const bool strict = true, const bool allow_exceptions = true)
+ ```
+ ```cpp
+ template::value, int> = 0> static basic_json from_bson(A1 && a1, A2 && a2, const bool strict = true, const bool allow_exc [...]
+ ```
+
+### [`nlohmann::basic_json::operator=`](../api/basic_json/operator=.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ - reference&
+ + basic_json&
+ operator=(basic_json other) noexcept ( std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and std::is_nothrow_move_constructible
+ ```
+
+### [`nlohmann::basic_json::to_bson`](../api/basic_json/to_bson.md)
+
+*New addition to the public API.*
+
+- New symbols (3 overloads).
+ ```cpp
+ static std::vector to_bson(const basic_json& j)
+ ```
+ ```cpp
+ static void to_bson(const basic_json& j, detail::output_adapter o)
+ ```
+ ```cpp
+ static void to_bson(const basic_json& j, detail::output_adapter o)
+ ```
+
+### [`nlohmann::json_pointer::to_string`](../api/json_pointer/to_string.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ std::string to_string() const
+ - noexcept
+ ```
+
+## 3.3.0
+
+### [`nlohmann::adl_serializer::from_json`](../api/adl_serializer/from_json.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ template static
+ - void from_json(BasicJsonType&& j, ValueType& val) noexcept( noexcept(::nlohmann::from_json(std::forward(j), val)))
+ + auto from_json(BasicJsonType&& j, ValueType& val) noexcept( noexcept(::nlohmann::from_json(std::forward(j), val))) -> decltype( ::nlohmann::from_json(std::forward static void to_json(BasicJsonType& j, ValueType&& val) noexcept( noexcept(::nlohmann::to_json(j, std::forward(val)))
+ + template static auto to_json(BasicJsonType& j, ValueType&& val) noexcept( noexcept(::nlohmann::to_json(j, std::forward(val))
+ ```
+
+### [`nlohmann::basic_json::get_ptr`](../api/basic_json/get_ptr.md)
+
+*Updates the `noexcept` specification.*
+
+- Changed:
+ ```diff
+ template::value and std::is_const::type>::value, int>::type =
+ - const PointerType get_ptr() const noexcept
+ + auto get_ptr() const noexcept -> decltype(std::declval().get_impl_ptr(std::declval()))
+ ```
+
+### [`nlohmann::basic_json::get_to`](../api/basic_json/get_to.md)
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ template::value and detail::has_from_json::value, int> = 0> ValueType & get_to(ValueType& v) const noexcept(noexcept [...]
+ ```
+
+### `nlohmann::basic_json::insert_iterator`
+
+*New addition to the public API.*
+
+- New symbol.
+ ```cpp
+ template