5

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

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

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

注释 42 解释:

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

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

4

1 回答 1

7

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

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对象表示不同于此类对象的副本的对象表示,尽管它们具有相同的值。

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

于 2012-10-07T23:18:08.520 回答