非平凡可复制类型的值表示

Jos*_*eld 5 c++ object memory-model

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

类型对象的对象表示是由类型对象占据TN个 unsigned char对象的序列T,其中N等于sizeof(T).对象的值表示是保存type值的位集T.对于简单的可复制类型,值表示是对象表示中的一组位,用于确定,该是实现定义的值集的一个离散元素.42

我理解对象表示值表示是不同的,以允许一些对象表示不参与对象的值(例如,填充).虽然我不太了解关于可复制类型的观点.非平凡的可复制类型没有值吗?非平凡可复制类型的部分值表示是否存在于其对象表示之外?

注42解释:

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

我仍然不明白为什么之前的声明仅适用于简单的可复制类型.这有什么意义?

Ker*_* SB 7

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

struct Foo
{
    Bar * p;

    Foo() : p(new Bar) { }
    ~Foo() { delete p; }

    // copy, assign
};
Run Code Online (Sandbox Code Playgroud)

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

Foo::Foo(Foo const & rhs) : p(new Bar(*rhs.p)) { }
Run Code Online (Sandbox Code Playgroud)

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

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