reinterpret_cast <qintptr>(...)可以是否定的?

时间:2016-04-06 20:58:19

标签: c++ qt

我有一个类,它是表示底层对象保存实际数据的层次结构的基础:

class Data { };

class Item
{
public:
    AItem(AItem *source = nullptr) : m_Data(source ? reinterpret_cast<qintptr>(source) : -reinterpret_cast<qintptr>(new Data)) {}
    virtual ~AItem() { if(m_Data < 0) delete reinterpret_cast<AData*>(-m_Data); }

    qintptr id() const { return m_Data; }
    Data *data() const { return m_Data < 0 ? reinterpret_cast<AData*>(-m_Data) : reinterpret_cast<AItem*>(m_Data)->data(); }

private:
    qintptr m_Data;
};

请注意,当没有&#34;来源&#34;在构造函数中设置我创建Data的新对象,将其重新解释为整数,否定它,然后将其保存到m_Data。这是至关重要的,因为它是从Data中的层次结构中获取data()对象时使用的,当然也包括在析构函数中。

然而,这可能是一个危险的黑客,因为它依赖于reinterpret_cast<qintptr>(source)reinterpret_cast<qintptr>(new Data)永远不会产生负整数。他们可以吗?

如果他们可以(我认为他们可以,但我找不到明确的答案)我将不得不添加布尔标志以检查该项是否是基础对象。

1 个答案:

答案 0 :(得分:0)

QT 5 documentation表示qintptrqint32qint64的typedef,后者又是signed intsigned long long的typedef

所以,是的,价值可能是负面的。你必须编写正确的代码而不是使用“sign bit as extra boolean flag”hack。