From b255e07dd378a7c3cf042865a34473e7c7c2f127 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Fri, 9 Oct 2026 16:54:05 +0200 Subject: [PATCH] Test discarded views with is_discarded() in the operator[] docs and examples The explicit conversion to bool of basic_json_view is gone. Signed-off-by: Niels Lohmann --- docs/mkdocs/docs/api/basic_json_view/operator[].md | 2 +- docs/mkdocs/docs/examples/basic_json_view__operator[].cpp | 8 +++++--- .../examples/basic_json_view__operator[]_json_pointer.cpp | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/mkdocs/docs/api/basic_json_view/operator[].md b/docs/mkdocs/docs/api/basic_json_view/operator[].md index 30130db7c..53d95bed0 100644 --- a/docs/mkdocs/docs/api/basic_json_view/operator[].md +++ b/docs/mkdocs/docs/api/basic_json_view/operator[].md @@ -93,7 +93,7 @@ None of these exceptions carry a [`JSON_DIAGNOSTICS`](../macros/json_diagnostics Unlike `BasicJsonType::operator[]`, which is undefined behavior (guarded by a [runtime assertion](../../features/assertions.md)) for a missing key on a **const** value, this operator returns a safe, testable result for a missing key or an index out of range: a [discarded](is_discarded.md) view, which is -`#!cpp false` in a boolean context. +tested with [`is_discarded`](is_discarded.md). There is also no non-const overload that inserts a missing key or extends an array -- a view never modifies the document. diff --git a/docs/mkdocs/docs/examples/basic_json_view__operator[].cpp b/docs/mkdocs/docs/examples/basic_json_view__operator[].cpp index e17919a9d..1919e06be 100644 --- a/docs/mkdocs/docs/examples/basic_json_view__operator[].cpp +++ b/docs/mkdocs/docs/examples/basic_json_view__operator[].cpp @@ -22,17 +22,19 @@ int main() std::cout << user["name"].materialize().dump(); // operator[] on a missing object key gives a discarded view -- test - // it with a plain "if". The const overload of json::operator[] + // it with is_discarded(). The const overload of json::operator[] // would instead be undefined behavior (guarded by an assertion) for // a missing key - if (const auto email = user["email"]) + const auto email = user["email"]; + if (!email.is_discarded()) { std::cout << " <" << email.materialize().dump() << ">"; } // the same holds for an array index past the end: a discarded view, // not undefined behavior - if (const auto first_tag = user["tags"][0]) + const auto first_tag = user["tags"][0]; + if (!first_tag.is_discarded()) { std::cout << " #" << first_tag.materialize().dump(); } diff --git a/docs/mkdocs/docs/examples/basic_json_view__operator[]_json_pointer.cpp b/docs/mkdocs/docs/examples/basic_json_view__operator[]_json_pointer.cpp index 15f37555d..2ea8130a6 100644 --- a/docs/mkdocs/docs/examples/basic_json_view__operator[]_json_pointer.cpp +++ b/docs/mkdocs/docs/examples/basic_json_view__operator[]_json_pointer.cpp @@ -25,7 +25,8 @@ int main() // a missing key or an out-of-range index along the path gives a // discarded view, exactly where const json::operator[] would be // undefined behavior for the same pointer - if (const auto missing = root[json_pointer("/region/servers/5/metrics/cpu")]) + const auto missing = root[json_pointer("/region/servers/5/metrics/cpu")]; + if (!missing.is_discarded()) { std::cout << missing.materialize().dump() << '\n'; }