【问题标题】:Value representation of non-trivially copyable types非平凡可复制类型的值表示
【发布时间】:2012-10-07 23:07:43
【问题描述】:

我对标准中的以下段落(ISO/IEC 14882:2011(E) 的§3.9/4)很感兴趣:

T 类型对象的对象表示T 类型对象占用的 Nunsigned char 对象的序列,其中 N 等于sizeof(T)。对象的值表示是一组保存T 类型值的位。对于普通可复制类型,值表示是对象表示中的一组位,它们确定 value,它是实现定义的一组值的一个离散元素。42

我了解对象表示值表示是不同的,以允许某些对象表示不参与对象的值(例如,填充)。不过,我不太明白可复制的类型。非平凡可复制类型没有值吗?非平凡可复制类型的部分值表示是否可以存在于其对象表示之外?

注释 42 解释:

意图是 C++ 的内存模型与 ISO/IEC 9899 编程语言 C 的内存模型兼容。

我仍然不明白为什么前面的语句专门针对可复制的类型。这有什么意义?

【问题讨论】:

    标签: c++ object memory-model


    【解决方案1】:

    标准示例是管理资源的类:

    struct Foo
    {
        Bar * p;
    
        Foo() : p(new Bar) { }
        ~Foo() { delete p; }
    
        // copy, assign
    };
    

    Foo 类型的对象有一个值,但该值不能通过复制对象表示来复制(在这种情况下,它只是 p 的值)。复制Foo 类型的对象需要复制类的语义,即“对象拥有 指针”。因此,一个合适的副本需要一个合适的、用户定义的副本构造函数:

    Foo::Foo(Foo const & rhs) : p(new Bar(*rhs.p)) { }
    

    现在Foo 类型对象的对象表示不同于此类对象的副本的对象表示,尽管它们具有相同的值。

    相比之下,只要对象表示一致,int 的值就与另一个 int 的值相同。 (由于填充,这是一个充分但不是必要的条件。)

    【讨论】:

    • 我不明白你说“......,虽然它们具有相同的价值。”当一个对象中p 的值与从第一个对象复制的值不同时。
    猜你喜欢
    • 2014-11-19
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2020-11-08
    相关资源
    最近更新 更多