引用是否有存储位置,还是只是另一个位置的别名?这是否因 C++ 版本而异,还是与所有 C++ 版本一致?如果一个引用有一个存储位置,那么它是否只允许像类型这样的指针上的值语义?
当您这样使用参考时,参考将如何工作:
struct aStruct{
int aVariable;
aClass& aReferencetoaClass;
};
它占用空间还是别名?
引用是否有存储位置,还是只是另一个位置的别名?这是否因 C++ 版本而异,还是与所有 C++ 版本一致?如果一个引用有一个存储位置,那么它是否只允许像类型这样的指针上的值语义?
当您这样使用参考时,参考将如何工作:
struct aStruct{
int aVariable;
aClass& aReferencetoaClass;
};
它占用空间还是别名?
最新的C++20 规范(第 9.2.3.3 节)并且至少自C++ 2005 草案规范状态以来:
未指定引用是否需要存储
实际实施是根据具体情况而定的。显然,如果一个类有一个成员变量,它是一个需要存储在某处的引用。但是正如您所说,编译器在何时将引用单独用作别名时有回旋余地。
大多数编译器,至少对于 C++17 之前的任何 C++ 标准,都会有效地将引用实现为指针,除非进行了优化。
特别是,在 a 内部struct
,它将占用指针的大小(加上对齐/填充等)。
因此,这将在大多数环境中成立:
struct S {
char & a;
};
static_assert(sizeof(S) == sizeof(void *));