25

引用是否有存储位置,还是只是另一个位置的别名?这是否因 C++ 版本而异,还是与所有 C++ 版本一致?如果一个引用有一个存储位置,那么它是否只允许像类型这样的指针上的值语义?

当您这样使用参考时,参考将如何工作:

struct aStruct{
   int aVariable;
   aClass& aReferencetoaClass;
};

它占用空间还是别名?

4

2 回答 2

18

最新的C++20 规范(第 9.2.3.3 节)并且至少自C++ 2005 草案规范状态以来:

未指定引用是否需要存储

实际实施是根据具体情况而定的。显然,如果一个类有一个成员变量,它是一个需要存储在某处的引用。但是正如您所说,编译器在何时将引用单独用作别名时有回旋余地。

于 2019-07-01T13:31:02.760 回答
12

大多数编译器,至少对于 C++17 之前的任何 C++ 标准,都会有效地将引用实现为指针,除非进行了优化。

特别是,在 a 内部struct,它将占用指针的大小(加上对齐/填充等)。

因此,这将在大多数环境中成立:

struct S {
    char & a;
};

static_assert(sizeof(S) == sizeof(void *));
于 2019-07-01T13:37:35.543 回答