您如何以正式和严格的方式定义(解释)C ++中的引用类型是什么?
我尝试去Google搜寻,并研究了Stroustrup的“ C ++编程语言”,但是在那里我看不到这个概念的定义。
引用是别名,是对象的备用名称。它本身不是对象(因此,not是指针,即使它们的某些用法与指针的用法重叠)。
参考文献因其非客观性而受到一定的限制。例如,您不能创建引用数组。它们必须在声明后立即进行初始化(绑定,就座),因为没有别名的对象就不可能存在它们。
但是,您可以存储它们,并且它们遵循自动变量或成员变量的规则。它们的用途之一是通过C ++的按值传递函数调用。
请注意,const引用具有别名的整洁效果:绑定到临时(即未命名)对象时,它们为该对象命名,因此将其寿命延长到引用本身的寿命。
{ // Block scope
Foo fooVal = makeFoo(); // Say makeFoo() returns a (temporary, unnamed) Foo
// Here the temporary Foo is dead (fooVal is a copy).
// Foo &fooRef = makeFoo(); // Error, reference is non-const
Foo const &fooCRef = makeFoo(); // All good
// ...
// The second temporary is still alive
fooCRef.doSomethingFunny(); // Works like a charm !
} // The second temporary dies with fooRef
不过请注意,有可能(尽管人为地)使对象超出范围,而引用仍指向该对象。然后,您将具有悬挂引用,该不再使用(这样做将是未定义的行为)。
Foo *fooPtr = new Foo; // Here is a Foo
Foo &fooRef = *fooPtr; // Here is an alias for that Foo
delete fooPtr; // Here is the end of that Foo's life
fooRef.doSomethingFunny(); // Here comes trouble...
关于
”您如何以正式和严格的方式定义(解释)C ++中的引用类型是什么?
C ++ 11标准在其中为引用类型
提供了以下正式和严格的定义。§8.3.2/ 1
”在声明T D中,D具有以下任一形式
&
属性说明符序列optD1
&&
属性说明符序列optD1
并且声明T D1
中的标识符类型为“ derived-declarator-type-listT
”,则声明的类型D
的标识符为“ T的引用[derived-declarator-type-list的引用。”
§5.5
有效地,这意味着引用充当”如果表达式最初的类型为“对
T
的引用”(8.3.2,8.5.3),则该类型在调整为T
之前任何进一步的分析。该表达式指定由引用表示的对象或功能,并且表达式是左值还是x值,具体取决于表达式
alias
。您可以将引用视为自动取消引用的const
指针,它解释了大多数行为,只是引用不一定占用存储空间(编译器可能会完全优化它)。int&aref = a;
#include <stdio.h>
#include "stdafx.h"
int main()
{
int a=9;
int & aref = a;
a++;
cout << "The value of a is %i\n" << aref;
return 0;
}
也要记住
- 引用必须始终引用某物。不允许为NULL。
- 创建引用时必须对其进行初始化。未分配的引用不能存在。
- 一旦初始化,就无法将其更改为另一个变量。
如果有帮助,请告诉我,谢谢
https://abseil.io/blog/20180531-regular-types给出string_view和span作为引用类型的示例,这些引用类型在传递给函数时应像引用参数一样起作用。
https://docs.microsoft.com/en-us/cpp/cpp/value-types-modern-cpp?view=vs-2019 Microsoft文档将引用类型与多态类型(具有至少一个虚函数或成员变量的类型)同义。它们与值类型相反(Bjarne Stroustrup称为具体类型)。使用值类型时,由于运行时多态性,编译器可以直接访问需要间接访问的成员和引用类型。