标准布局类型和reinterpret_cast

时间:2011-09-21 23:11:05

标签: c++ c++11 reinterpret-cast

如果我将结构的成员复制到我的班级,我是否可以从我的班级投射到一个结构?

#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);
    }
}

1 个答案:

答案 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);
}

最重要的是,您需要Bufferiovec都是标准布局类型,iovec不能比{{1}更严格(更大) }。

  

§5.2.10p7。可以将对象指针显式转换为对象指针   不同的类型。当“Buffer指针”类型的prvalue v为时   转换为“指向 cv T1的指针”,结果为T2   如果static_cast<cv T2*>(static_cast<cv void*>(v))T1都是标准布局   类型(§3.9)和T2的对齐要求并不严格   那些T2,或者两种类型都是T1。 (...)

您还需要注意不要破坏strict aliasing rules:通常,您不能使用两个指针或对引用相同内存位置的不同类型的引用。