First off, you cannot cast away constness:
§5.2.10p2. The reinterpret_cast
operator shall not cast away constness (§5.2.11). (...)
So you need at least to write that as
operator iovec const*() const
{
return reinterpret_cast<iovec const*>(this);
}
or
operator iovec *()
{
return reinterpret_cast<iovec *>(this);
}
On top of that, you need to have both Buffer
and iovec
be standard-layout types, and iovec
cannot have an alignment stricter (i.e. larger) than Buffer
.
§5.2.10p7. An object pointer can be explicitly converted to an object pointer of
a different type. When a prvalue v
of type “pointer to T1
” is
converted to the type “pointer to cv T2
”, the result is static_cast<cv T2*>(static_cast<cv void*>(v))
if both T1
and T2
are standard-layout
types (§3.9) and the alignment requirements of T2
are no stricter than
those of T1
, or if either type is void
. (...)
You also need to be careful not to break the strict aliasing rules: in general, you cannot use two pointers or references to different types that refer to the same memory location.