|
Boost Users : |
Subject: Re: [Boost-users] [Variant] Bug assigning similar, but different concrete types during assignment / ctor relay
From: Michael Powell (mwpowellhtx_at_[hidden])
Date: 2018-11-18 23:45:20
On Sun, Nov 18, 2018 at 6:33 PM Michael Powell <mwpowellhtx_at_[hidden]> wrote:
>
> On Sun, Nov 18, 2018 at 6:22 PM Steven Watanabe via Boost-users
> <boost-users_at_[hidden]> wrote:
> >
> > AMDG
> >
> > On 11/18/2018 04:00 PM, Michael Powell via Boost-users wrote:
> > > I've got a Boost.Variant confusion going on during ctor relay.
Identified. Typo in my which comprehension. I had Integer and FP backwards. :)
> > > I have two types participating in the Variant, an Integer type and a
> > > Floating Point type. Both are Numeric as a base class. i.e. something
> > > like:
> > >
> > > template<typename T>
> > > struct numeric {};
> > >
> > > struct integer : numeric<long> {};
> > >
> > > struct floating_point : numeric<double> {};
> > >
> >
> > integer and floating_point are unrelated.
> > I don't see any for for variant to get confused
> > about them.
> >
> > Something like this could happen during
> > assignment, if an exception is thrown.
> > Variant assignment only provides the basic
> > exception guarantee and may fall back on a
> > no-throw default constructor of one of the
> > bounded types.
> >
> > > Then:
> > >
> > > using constant_value = boost::variant<..., floating_point, integer, ...>;
> > >
> > > Somewhere during the handling, I have a test case in which I have a
> > > constant_value{} starting out in life as an integer{}.
> > >
> > > However, somewhere during handling, variant is misinterpreting integer
> > > (which=3) as a floating_point (which=2).
> > >
> >
> > So, the first `...` contains two types?
> >
> > > This is incorrect, of course.
> > >
> > > I could force the issue, I suppose and re-set the value to the
> > > integer, but I'd like to understand the issue. I think it's a bug in
> > > variant, or perhaps a "feature" confusing integer with floating_point
> > > along base class numeric lines?
> > >
> >
> > This code seems to work correctly:
> >
> > #include <boost/variant.hpp>
> > #include <iostream>
> >
> > template<typename T>
> > struct numeric {};
> >
> > struct integer : numeric<long> {};
> >
> > struct floating_point : numeric<double> {};
> >
> > using constant_value = boost::variant<char, floating_point, integer, void*>;
> >
> > int main() {
> > constant_value x = integer{};
> > std::cout << x.which() << std::endl;
> > std::cout << x.type().name() << std::endl;
> > }
> >
> > $ ./scratch
> > 2
> > struct integer
> > $
>
> I'm trying to identify the issue. I am also passing them, or their
> hosts/containers around as reference parameters. Shouldn't make a
> difference, I think, since it is a reference?
>
> No relation? Other than the fact they are both numeric. I do not know
> why that would make a difference, but it seems to be.
>
> > In Christ,
> > Steven Watanabe
> > _______________________________________________
> > Boost-users mailing list
> > Boost-users_at_[hidden]
> > https://lists.boost.org/mailman/listinfo.cgi/boost-users
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net