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