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)子对象
只有这三种可能性。
答案 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.)的主题。