Boost logo

Boost Users :

Subject: Re: [Boost-users] [Variant] Bug assigning similar, but different concrete types during assignment / ctor relay
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2018-11-18 23:21:41


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.
>
> 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
$

In Christ,
Steven Watanabe


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