json/include/nlohmann
Jaakko Moisio 1c130315ac Fix compilation of input_adapter(container) in edge cases
This fixes a compilation issue with the library if trying to parse JSON from a
custom container type that doesn't support detecting `begin()` and `end()`
functions via ADL.

`include/nlohmann/detail/input/input_adapters.hpp` defines convenience function
for creating input adapter for STL-like containers. It should support iterators
both via `std::begin()` and `std::end()`, as well as `begin()` and `end()` found
via ADL. However, the former doesn't actually work for iterable types not
defined in the `std` namespace, due to the way the return type deduction is
implemented:

    $ cat test.cc
    #include <iostream>
    #include <nlohmann/json.hpp>

    const char DATA[] = R"("Hello, world!")";

    struct MyIterable {
        using iterator = const char*;
        using const_iterator = iterator;
        const_iterator begin() const { return DATA; }
        const_iterator end() const { return DATA + sizeof(DATA); }
    };

    int main()
    {
        const auto c = MyIterable {};
        std::cout << nlohmann::json::parse(c) << "\n";
        return 0;
    }
    $ g++ --version
    g++ (Ubuntu 10.2.0-13ubuntu1) 10.2.0
    Copyright (C) 2020 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    $ g++ -std=c++11 test.cc
    ...
    /usr/include/nlohmann/detail/input/input_adapters.hpp:375:6: note: candidate: ‘template<class ContainerType> decltype (nlohmann::detail::input_adapter(begin(container), end(container))) nlohmann::detail::input_adapter(const ContainerType&)’
      375 | auto input_adapter(const ContainerType& container) -> decltype(input_adapter(begin(container), end(container)))
          |      ^~~~~~~~~~~~~
    /usr/include/nlohmann/detail/input/input_adapters.hpp:375:6: note:   template argument deduction/substitution failed:
    /usr/include/nlohmann/detail/input/input_adapters.hpp: In substitution of ‘template<class ContainerType> decltype (nlohmann::detail::input_adapter(begin(container), end(container))) nlohmann::detail::input_adapter(const ContainerType&) [with ContainerType = MyIterable]’:
    ...

In the above example the trailing type deduction won't look for the `begin()`
and `end()` functions in the `std` namespace, although the function body would.

I don't know about a more elegant fix in C++11 except to spell out the return
type verbatim.
2020-12-25 15:08:55 +01:00
..
detail Fix compilation of input_adapter(container) in edge cases 2020-12-25 15:08:55 +01:00
thirdparty/hedley ⬆️ Hedley 14 (dev branch) 2020-08-12 13:00:57 +02:00
adl_serializer.hpp 🎨 replace alternative operators (and, not, or) 2020-06-03 14:20:36 +02:00
byte_container_with_subtype.hpp Change underscore placement 2020-12-11 13:43:17 +01:00
json_fwd.hpp Fix compilation for xcode 9.x 2020-07-03 01:44:18 +01:00
json.hpp Include <string_view> in "nlohmann/json.hpp" when C++17 is used 2020-12-20 19:40:36 +05:00
ordered_map.hpp ordered_map::insert(InputIt first, InputIt last) is added 2020-12-07 20:15:41 +03:00