我对标准中的以下段落感兴趣( ISO / IEC 14882:2011(E)的§3.9/ 4):
类型为
T
的对象的对象表示是由类型{{{}对象占用的 Nunsigned char
个对象的序列1}},其中 N 等于T
。对象的值表示是保存类型sizeof(T)
的值的位集。对于简单的可复制类型,值表示是对象表示中的一组位,用于确定值,它是实现定义的一组值的一个离散元素。 42
我理解对象表示和值表示是不同的,允许某些对象表示不参与对象的值(例如,填充)。虽然我不太了解关于可复制类型的观点。非平凡的可复制类型没有值吗?非平凡可复制类型的部分值表示是否存在于其对象表示之外?
注42解释:
目的是使C ++的内存模型与ISO / IEC 9899编程语言C的内存模型兼容。
我仍然不明白为什么之前的声明仅适用于简单的可复制类型。这有什么意义?
答案 0 :(得分: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
的对象的对象表示与此类对象的副本的对象表示不同,尽管它们具有相同的值。
相反,只要对象表示重合,int
的值就与另一个int
的值相同。 (由于填充,这是一个充分但不必要的条件。)