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 to A or B. It should
instead copy construct from the output of extract'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
//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 my_variant;
int main() {
A a;
my_variant x(a);
#ifndef WAR
my_variant y = wrap(x);
#else
my_variant y = wrap(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::initializer::initialize(void*,
std::remove_reference >&>::type)’