mirror of
https://github.com/nlohmann/json.git
synced 2026-07-08 19:45:09 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 282f84cc8e |
@@ -90,13 +90,11 @@ jobs:
|
|||||||
- name: Get latest CMake and ninja
|
- name: Get latest CMake and ninja
|
||||||
uses: lukka/get-cmake@f5b8fbb4d77cec1acc5a5f9f0df4beffaf5d98d9 # v4.3.4
|
uses: lukka/get-cmake@f5b8fbb4d77cec1acc5a5f9f0df4beffaf5d98d9 # v4.3.4
|
||||||
- name: Set extra CXX_FLAGS for latest std_version
|
- name: Set extra CXX_FLAGS for latest std_version
|
||||||
# /wd5285 silences C5285 emitted by the bundled third-party doctest.h, which
|
|
||||||
# specializes std::tuple (newly diagnosed by the VS2026 v145 toolset)
|
|
||||||
run: |
|
run: |
|
||||||
if [ "${{ matrix.std_version }}" = "latest" ]; then
|
if [ "${{ matrix.std_version }}" = "latest" ]; then
|
||||||
echo "flags=/permissive- /std:c++latest /utf-8 /W4 /WX /wd5285" >> $GITHUB_ENV
|
echo "flags=/permissive- /std:c++latest /utf-8 /W4 /WX" >> $GITHUB_ENV
|
||||||
else
|
else
|
||||||
echo "flags=/W4 /WX /wd5285" >> $GITHUB_ENV
|
echo "flags=/W4 /WX" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
shell: bash
|
shell: bash
|
||||||
- name: Run CMake (Release)
|
- name: Run CMake (Release)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
# -Wno-extra-semi-stmt The library uses assert which triggers this warning.
|
# -Wno-extra-semi-stmt The library uses assert which triggers this warning.
|
||||||
# -Wno-padded We do not care about padding warnings.
|
# -Wno-padded We do not care about padding warnings.
|
||||||
# -Wno-covered-switch-default All switches list all cases and a default case.
|
# -Wno-covered-switch-default All switches list all cases and a default case.
|
||||||
# -Wno-unsafe-buffer-usage Otherwise Doctest would not compile.
|
# -Wno-unsafe-buffer-usage Otherwise library code (strlen) would not compile.
|
||||||
# -Wno-missing-noreturn We found no way to silence this warning otherwise, see PR #4871
|
# -Wno-missing-noreturn We found no way to silence this warning otherwise, see PR #4871
|
||||||
|
|
||||||
set(CLANG_CXXFLAGS
|
set(CLANG_CXXFLAGS
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
# -Wno-aggregate-return The library uses aggregate returns.
|
# -Wno-aggregate-return The library uses aggregate returns.
|
||||||
# -Wno-long-long The library uses the long long type to interface with system functions.
|
# -Wno-long-long The library uses the long long type to interface with system functions.
|
||||||
# -Wno-namespaces The library uses namespaces.
|
# -Wno-namespaces The library uses namespaces.
|
||||||
# -Wno-nrvo Doctest triggers this warning.
|
|
||||||
# -Wno-padded We do not care about padding warnings.
|
# -Wno-padded We do not care about padding warnings.
|
||||||
# -Wno-system-headers We do not care about warnings in system headers.
|
# -Wno-system-headers We do not care about warnings in system headers.
|
||||||
# -Wno-templates The library uses templates.
|
# -Wno-templates The library uses templates.
|
||||||
@@ -232,7 +231,6 @@ set(GCC_CXXFLAGS
|
|||||||
-Wnonnull
|
-Wnonnull
|
||||||
-Wnonnull-compare
|
-Wnonnull-compare
|
||||||
-Wnormalized=nfkc
|
-Wnormalized=nfkc
|
||||||
-Wno-nrvo
|
|
||||||
-Wnull-dereference
|
-Wnull-dereference
|
||||||
-Wodr
|
-Wodr
|
||||||
-Wold-style-cast
|
-Wold-style-cast
|
||||||
|
|||||||
@@ -66,24 +66,6 @@ which forces the explicit `get` form and can catch unintended conversions at com
|
|||||||
floating-point value as an integer truncates it, and narrowing conversions may overflow. See
|
floating-point value as an integer truncates it, and narrowing conversions may overflow. See
|
||||||
[number conversion](types/number_handling.md#number-conversion) for details and how to guard against it.
|
[number conversion](types/number_handling.md#number-conversion) for details and how to guard against it.
|
||||||
|
|
||||||
!!! warning "std::optional direct construction from JSON null throws"
|
|
||||||
|
|
||||||
Constructing or assigning `std::optional<T>` directly from a JSON value does not correctly produce
|
|
||||||
`std::nullopt` for a JSON `null`:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
json j_null;
|
|
||||||
std::optional<std::string> opt = j_null; // ❌ throws type_error 302
|
|
||||||
```
|
|
||||||
|
|
||||||
This is due to C++ language rules: `std::optional<T>` has its own converting constructor that is chosen over
|
|
||||||
`basic_json::operator T()` when both are viable. Use `get<std::optional<T>>()` or `get_to()` instead:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
auto opt = j_null.get<std::optional<std::string>>(); // ✅ std::nullopt
|
|
||||||
j_null.get_to(opt); // ✅ std::nullopt
|
|
||||||
```
|
|
||||||
|
|
||||||
## Putting values in
|
## Putting values in
|
||||||
|
|
||||||
The reverse direction works the same way: assigning or constructing a `json` from a C++ value converts it to JSON.
|
The reverse direction works the same way: assigning or constructing a `json` from a C++ value converts it to JSON.
|
||||||
|
|||||||
@@ -1761,27 +1761,16 @@ TEST_CASE("std::filesystem::path")
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !JSON_USE_IMPLICIT_CONVERSIONS
|
||||||
TEST_CASE("std::optional")
|
TEST_CASE("std::optional")
|
||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
{
|
{
|
||||||
const json j_null;
|
json j_null;
|
||||||
const std::optional<std::string> opt_null;
|
std::optional<std::string> opt_null;
|
||||||
|
|
||||||
CHECK(json(opt_null) == j_null);
|
CHECK(json(opt_null) == j_null);
|
||||||
CHECK(j_null.get<std::optional<std::string>>() == std::nullopt);
|
CHECK(j_null.get<std::optional<std::string>>() == std::nullopt);
|
||||||
|
|
||||||
// Constructing std::optional<T> directly from JSON null throws because
|
|
||||||
// std::optional's own converting constructor is chosen over basic_json's
|
|
||||||
// operator T(). This is a language-level limitation (std::optional<T> is
|
|
||||||
// constructible from T, and T is constructible from basic_json via the
|
|
||||||
// operator); there is no SFINAE path that distinguishes "call from inside
|
|
||||||
// std::optional's constructor" from "direct call". Use get<std::optional<T>>()
|
|
||||||
// or get_to() instead for correct null handling. See #4864 and #5246.
|
|
||||||
CHECK_THROWS_WITH_AS(std::optional<std::string>(j_null),
|
|
||||||
"[json.exception.type_error.302] type must be string, but is null", json::type_error&);
|
|
||||||
CHECK_THROWS_WITH_AS(std::optional<int>(j_null),
|
|
||||||
"[json.exception.type_error.302] type must be number, but is null", json::type_error&);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("string")
|
SECTION("string")
|
||||||
@@ -1830,6 +1819,7 @@ TEST_CASE("std::optional")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef JSON_HAS_CPP_17
|
#ifdef JSON_HAS_CPP_17
|
||||||
#undef JSON_HAS_CPP_17
|
#undef JSON_HAS_CPP_17
|
||||||
|
|||||||
Vendored
+7115
-5102
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user