如果我将结构的成员复制到我的班级,我是否可以从我的班级投射到一个结构?
#include <stdint.h>
#include <sys/uio.h>
class Buffer
{
public:
void * address;
size_t size;
Buffer(void * address = nullptr, size_t size = 0)
: address(address), size(size)
{
}
operator iovec *() const
{
// Cast this to iovec. Should work because of standard layout?
return reinterpret_cast<iovec *>(this);
}
}
答案 0 :(得分:4)
首先,你不能抛弃constness:
§5.2.10p2。
reinterpret_cast
运算符不应丢弃constness(第5.2.11节)。 (...)
所以你至少需要把它写成
operator iovec const*() const
{
return reinterpret_cast<iovec const*>(this);
}
或
operator iovec *()
{
return reinterpret_cast<iovec *>(this);
}
最重要的是,您需要Buffer
和iovec
都是标准布局类型,iovec
不能比{{1}更严格(更大) }。
§5.2.10p7。可以将对象指针显式转换为对象指针 不同的类型。当“
Buffer
指针”类型的prvaluev
为时 转换为“指向 cvT1
的指针”,结果为T2
如果static_cast<cv T2*>(static_cast<cv void*>(v))
和T1
都是标准布局 类型(§3.9)和T2
的对齐要求并不严格 那些T2
,或者两种类型都是T1
。 (...)
您还需要注意不要破坏strict aliasing rules:通常,您不能使用两个指针或对引用相同内存位置的不同类型的引用。