add constraints for variadic json_ref constructors

Fixes #1292
pull/1294/head
Théo DELRIEU 2018-10-12 10:54:58 +02:00
parent e426219256
commit 11fecc25af
No known key found for this signature in database
GPG Key ID: A5A505438C20539A
3 changed files with 33 additions and 8 deletions

View File

@ -3,6 +3,8 @@
#include <initializer_list> #include <initializer_list>
#include <utility> #include <utility>
#include <nlohmann/detail/meta/type_traits.hpp>
namespace nlohmann namespace nlohmann
{ {
namespace detail namespace detail
@ -25,10 +27,12 @@ class json_ref
: owned_value(init), value_ref(&owned_value), is_rvalue(true) : owned_value(init), value_ref(&owned_value), is_rvalue(true)
{} {}
template<class... Args> template <
json_ref(Args&& ... args) class... Args,
: owned_value(std::forward<Args>(args)...), value_ref(&owned_value), is_rvalue(true) enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >
{} json_ref(Args && ... args)
: owned_value(std::forward<Args>(args)...), value_ref(&owned_value),
is_rvalue(true) {}
// class should be movable only // class should be movable only
json_ref(json_ref&&) = default; json_ref(json_ref&&) = default;

View File

@ -10591,6 +10591,9 @@ class serializer
#include <initializer_list> #include <initializer_list>
#include <utility> #include <utility>
// #include <nlohmann/detail/meta/type_traits.hpp>
namespace nlohmann namespace nlohmann
{ {
namespace detail namespace detail
@ -10613,10 +10616,12 @@ class json_ref
: owned_value(init), value_ref(&owned_value), is_rvalue(true) : owned_value(init), value_ref(&owned_value), is_rvalue(true)
{} {}
template<class... Args> template <
json_ref(Args&& ... args) class... Args,
: owned_value(std::forward<Args>(args)...), value_ref(&owned_value), is_rvalue(true) enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >
{} json_ref(Args && ... args)
: owned_value(std::forward<Args>(args)...), value_ref(&owned_value),
is_rvalue(true) {}
// class should be movable only // class should be movable only
json_ref(json_ref&&) = default; json_ref(json_ref&&) = default;

View File

@ -33,6 +33,14 @@ SOFTWARE.
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
using nlohmann::json; using nlohmann::json;
#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
#define JSON_HAS_CPP_17
#endif
#ifdef JSON_HAS_CPP_17
#include <variant>
#endif
#include "fifo_map.hpp" #include "fifo_map.hpp"
#include <fstream> #include <fstream>
@ -1649,4 +1657,12 @@ TEST_CASE("regression tests")
CHECK(diffs.size() == 1); // Note the change here, was 2 CHECK(diffs.size() == 1); // Note the change here, was 2
} }
#ifdef JSON_HAS_CPP_17
SECTION("issue #1292 - Serializing std::variant causes stack overflow")
{
static_assert(
not std::is_constructible<json, std::variant<int, float>>::value, "");
}
#endif
} }