完整的对象或子对象?

时间:2016-10-18 12:23:56

标签: c++ c++14 language-lawyer

C ++ 14标准说:

  

子对象可以是成员子对象,基类子对象或数组元素。不是任何其他对象的子对象的对象称为完整对象。 (§1.8(2))

对我来说,'can be'是否意味着隐含的'if if only only'是不明显的。举一个例子,在下面的代码片段中,是对完整对象或子对象的引用吗?

#include <iostream>
int main(){
  int i=2;
  unsigned char & r=reinterpret_cast<unsigned char&>(i);
  std::cout<<(int)r<<"\n";  
}

当r引用对象表示中的unsigned char时,r应该引用一个对象:

  

类型为T的对象的对象表示是由类型为T的对象占用的N个无符号字符对象的序列,...(§3.9(4))

编辑:你能非常清楚我的第一个字节是什么: 1)根本没有任何对象, 2)一个完整的对象, 3)子对象

只有这三种可能性。

1 个答案:

答案 0 :(得分:4)

该句子将术语 subobject 定义为以下之一:成员子对象基类子对象或数组元素。

您的代码段与子对象无关。 r是引用,而不是对象。而且,它甚至不引用一个对象,它只是将i的第一个字节别名。

来自[intro.object]:

  

当隐式更改联合的活动成员时,对象由定义(3.1), new-expression (5.3.4)创建(9.3) ),或创建临时对象时(4.4,12.2)。

i是由定义创建的对象。由于int不是类或数组类型,因此它没有子对象。对象表示,构成unsigned char存储的i的基础数组,不是对象 - 它不是在上述任何上下文中创建的。定义对象表示的措辞是core issue 1701(h / t T.C.)的主题。