
The boost::spirit::hold_any implementation includes the following functions defined in the detail sub-namespace:
// member of fxns<mpl::true_> specialisation, line 99 static void move(void* const* src, void** dest) { reinterpret_cast<T*>(dest)->~T(); *reinterpret_cast<T*>(dest) = *reinterpret_cast<T const*>(src); }
// member of fxns<mpl::false_> specialisation, line 99 static void move(void* const* src, void** dest) { (*reinterpret_cast<T**>(dest))->~T(); **reinterpret_cast<T**>(dest) = **reinterpret_cast<T* const*>(src); }
As I understand it, the object is destroyed _and then assigned to_; does it not need to be constructed at this point, i.e. have something like this (for the first specialisation):
new (reinterpret_cast<T*>(dest)) T( *reinterpret_cast<T const*>(src) );
Yes, your code looks about right. Would you care to submit a patch for me to apply? Regards Hartmut --------------- http://boost-spirit.com http://stellar.cct.lsu.edu