Boost logo

Boost Users :

Subject: [Boost-users] boost::variant & c++11
From: Bryan Catanzaro (bcatanzaro_at_[hidden])
Date: 2013-05-07 20:39:49


Hi -

I seem to have run into a regression with boost::variant from 1.48 to
1.53. With C++11 enabled, using g++, the following code seems to confuse
variant's constructor selection machinery: if you look at the line after
#ifndef WAR, the implicit conversion isn't happening, and so boost::variant
attempts to convert construct from extract<my_variant> to A or B. It should
instead copy construct from the output of extract<my_variant>'s implicit
conversion to my_variant. If I force an explicit conversion, this problem
doesn't occur. If I don't enable c++11, this problem doesn't occur. With
Boost 1.48, this problem doesn't occur.

Any advice from the list as to why this behavior changed?

Thanks,
bryan

#include <boost/variant.hpp>

//A simplified wrapper
template<typename T>
struct wrap {
    T t;
    wrap(T& _t) : t(_t) {}
    operator T() const {
        return t;
    }
    T force() const {
        return t;
    }
};

struct A{}; struct B{};

typedef boost::variant<A, B> my_variant;

int main() {
    A a;
    my_variant x(a);
#ifndef WAR
    my_variant y = wrap<my_variant>(x);
#else
    my_variant y = wrap<my_variant>(x).force();
#endif
}

And the error:

/home/bcatanzaro/boost_1_53_0/boost/variant/variant.hpp:1574:9: error: no
matching function for call to ‘boost::variant<A,
B>::initializer::initialize(void*,
std::remove_reference<wrap<boost::variant<A, B> >&>::type)’



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