1

構造体のメンバーをクラスにコピーした場合、クラスから構造体にキャストすることはできますか?

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

1 に答える 1

4

まず第一に、あなたは恒常性を捨てることはできません:

§5.2.10p2。オペレーターは恒常性を捨ててはreinterpret_castならない(§5.2.11)。(...)

したがって、少なくともそれを次のように書く必要があります

operator iovec const*() const
{
    return reinterpret_cast<iovec const*>(this);
}

また

operator iovec *()
{
    return reinterpret_cast<iovec *>(this);
}

その上、両方が必要であり、Buffer標準iovecレイアウトタイプである必要があり、。iovecよりも厳密な(つまり大きい)配置にすることはできませんBuffer

§5.2.10p7。オブジェクトポインタは、別のタイプのオブジェクトポインタに明示的に変換できます。タイプ「pointerto」のprvaluevがタイプ「pointertocvT1」に変換されると、結果は、とが 両方とも標準レイアウトタイプ(§3.9)であり、の配置要件が、の配置要件よりも厳密でない場合、またはいずれかである場合になります。タイプはです。(...) T2static_cast<cv T2*>(static_cast<cv void*>(v))T1T2T2T1void

また、厳密なエイリアシング規則に違反しないように注意する必要があります。一般に、同じメモリ位置を参照する2つのポインタまたは異なるタイプへの参照を使用することはできません。

于 2011-09-22T00:28:45.153 に答える