There's no conversion through void* but gcc still crashes with static_cast. C++ aliasing rules allow accesing a type T by through a base class, but we're accessing it through a non-existing derived type (rv<T>) so, I think this breaks aliasing rules. Adding __attribute__((__may_alias__)) to rv to tell the compiler that rv could alias any type seems to fix the problem (although is overkill IMHO). See:
Sadly while it fixes the problems in unit test. I have an application where I did added the may_alias attribute, and now I get passed unit tests for move and compiler defects in function lookup for classes that use RVALUE_REF. This isn't a complete fix for GCC 4.4. I'm still working on a better solution, and a proper review.
I convinced myself that with static_casts do not break strict aliasing rules since the conversion from rv<T>* to T* is valid. I believe that section 5.2.9 para 2 applies:
"An lvalue of type “cv1 B,” where B is a class type, can be cast to type “reference to cv2 D,” where D is a class
derived (Clause 10) from B, if a valid standard conversion from “pointer to D” to “pointer to B” exists (4.10),
cv2 is the same cv-qualification as, or greater cv-qualification than, cv1, and B is neither a virtual base class
of D nor a base class of a virtual base class of D. The result has type “cv2 D.” An rvalue of type “cv1 B” may
be cast to type “rvalue reference to cv2 D” with the same constraints as for an lvalue of type “cv1 B.” If the
object of type “cv1 B” is actually a subobject of an object of type D, the result refers to the enclosing object
of type D. Otherwise, the result of the cast is undefined."
I'll get back to you after a little more experimentation.
Regards,