- Notifications
You must be signed in to change notification settings - Fork 105
Closed
Description
Version of Boost
I'm using the standalone version tagged as 1.75.0 edbf866
Steps necessary to reproduce the problem
#define BOOST_JSON_STANDALONE #include <boost/json/src.hpp> #include <boost/json/parse.hpp> #include <boost/json/serialize.hpp> #include <boost/json/value.hpp> #include <boost/json/value_from.hpp> #include <boost/json/value_to.hpp> #include <iostream> #include <sstream> namespace test { template<std::size_t N> class zeroed_array : public std::array<unsigned char, N> { public: zeroed_array() : std::array<unsigned char, N>({0}) {} }; template<std::size_t N> void tag_invoke(const boost::json::value_from_tag&, boost::json::value& v, const zeroed_array<N>& a) { v = "hello world"; } template<std::size_t N> zeroed_array<N> tag_invoke(const boost::json::value_to_tag<zeroed_array<N>>&, const boost::json::value& v) { zeroed_array<N> res; res[0] = '1'; return res; } } int main() { test::zeroed_array<5> tmp; tmp[0] = '2'; std::cout << boost::json::value_from(tmp) << "\n"; tmp = boost::json::value_to<test::zeroed_array<5>>(boost::json::parse("\"hello world\"")); std::cout << tmp[0] << "\n"; }
Put the above code into /tmp/test.cpp
and compile with
clang++ --std=c++17 -o /tmp/test -I boost-json/include/ /tmp/test.cpp
Then run /tmp/test
. Actual output is
[50,0,0,0,0] 1
Expected output is
hello world 1
For some reason, template<std::size_t N> void tag_invoke(const boost::json::value_from_tag&, boost::json::value& v, const zeroed_array<N>& a)
is not used, but the generic implementation is used instead. I haven't been able to figure out why. Interestingly, the other tag_invoke (with value_to_tag
) is being used, as the second line of output shows.
Since value_from_generic
is not specific to std::array
, I expect that similar problems occur for other base classes.
All relevant compiler information
> clang++ --version clang version 9.0.1 Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /usr/bin
Same with
> g++-9 --version g++-9 (SUSE Linux) 9.3.1 20200406 [revision 6db837a5288ee3ca5ec504fbd5a765817e556ac2] Copyright (C) 2019 Free Software Foundation, Inc.
Metadata
Metadata
Assignees
Labels
No labels