C++ 引用是否具有存储位置?

C++ 引用是否具有存储位置?,c++,reference,language-lawyer,memory-layout,storage-duration,C++,Reference,Language Lawyer,Memory Layout,Storage Duration,引用是否具有存储位置,或者只是另一个位置的别名?这是否不同于C++修订版,或者它与C++的所有版本一致吗?如果引用有一个存储位置,那么它是否只允许在类似指针的类型上使用值语义 当您使用参考资料时,它将如何工作: struct aStruct{ int aVariable; aClass& aReferencetoaClass; }; 它是占用空间还是别名?The(§9.2.3.3)以及至少自该状态起: 未指定引用是否需要存储 实际执行是在个案基础上进行的。显然,如果一个类有

引用是否具有存储位置,或者只是另一个位置的别名?这是否不同于C++修订版,或者它与C++的所有版本一致吗?如果引用有一个存储位置,那么它是否只允许在类似指针的类型上使用值语义

当您使用参考资料时,它将如何工作:

struct aStruct{
   int aVariable;
   aClass& aReferencetoaClass;
};
它是占用空间还是别名?

The(§9.2.3.3)以及至少自该状态起:

未指定引用是否需要存储


实际执行是在个案基础上进行的。显然,如果一个类有一个成员变量,而该变量是一个需要存储在某处的引用。但正如您所说,编译器在将引用单独用作别名时有一定的回旋余地

> P>大多数编译器,对于任何C++标准,至少到C++ 17,将有效地实现引用作为指针,除非优化出来。 特别是在
结构中,它将占用指针的大小(加上对齐/填充等)

因此,这在大多数环境中都适用:

struct S {
    char & a;
};

static_assert(sizeof(S) == sizeof(void *));

是的,这取决于上下文。在一个结构中,您必须让引用需要存储,否则您将如何管理不同的结构实例?在创建临时引用的代码块中,它可能只是一个别名。我认为不指定它的目的正是为了让编译器能够选择。如果一个对象在ABI边界上可用,它需要遵循ABI。“特别是在一个结构内部”-不同意,它可能引用同一个结构的另一个成员,那么它可能只是一个别名。@Slava如何?所有数据成员都需要有一个唯一的地址(直到我们在C++20中获得
[[no_unique_address]]]
。@Acorn引用有存储空间是未指定的,所以如果它们有地址是未指定的。@eerorika确实如此。我想可以想出一个边缘情况,在那里可以证明一个类型有一个引用成员,它总是指向一个已知的位置,所以它可以优化它——但是我怀疑编译器会对它进行优化,因为它在实际代码中基本上是无用的。@斯拉瓦:是的,理论上C++实现可以做到这一点。在实践中,我不知道有哪种方法可以优化掉引用,这些引用可以被证明总是初始化为引用已知位置(结构/类的另一个成员,或者总是引用同一个静态对象)。因此,在实践中,引用基本上是围绕
char*const c的语法糖。否则,结构布局将依赖于有关如何初始化引用的编译时证明。这可能取决于您是否使用优化进行编译,并且不能链接release+debug objects=wird。