鉴于:
int& foo(); // don't care what the reference is to
int intVal;
Run Code Online (Sandbox Code Playgroud)
在以下两种情况下,右侧是相同的函数调用
int& intRef = foo();
intVal = foo(); // a reference is returned... a value is assigned.
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,返回的引用如何"转换"为值?
它是由int的赋值运算符完成的吗?
在语言层面,没有"取消引用参考"这样的概念.引用实现了左值的概念.变量和引用基本相同.变量和引用之间的唯一区别是变量由编译器自动绑定到存储中的位置,而引用通常在运行时通过用户操作绑定.
在您的示例中,intRef和之间没有概念上的区别intVal.两者都是类型的左值int.在概念层面,两者都通过相同的机制进行访问.您甚至可以将程序中的所有变量视为引用,这些变量由编译器隐式预先绑定.这基本上是Bjarne Stroustrup在TC++ PL中的意思,当他说(不是逐字)时,人们可以将引用视为现有变量的替代名称.
两者之间的差异可感知的唯一时刻是您创建这些实体并初始化它们.引用的初始化是将其绑定到存储中的某个位置的行为.变量的初始化是将初始值复制到现有存储中的行为.
但是一旦初始化了引用,它就会充当普通变量:读取/写入引用的行为是读取/写入它所绑定的存储位置的行为.获取引用的地址将评估它所绑定的存储位置的地址.等等.
在许多情况下,引用在内部实现为伪装的指针,即作为每次访问时隐式取消引用的不可见指针,这并不是秘密.在这种情况下(当它通过指针真正实现时),每次访问时都会再次取消引用.因此,正如您在问题中提出的那样,它不是赋值运算符.事实上,您在代码中提到了该引用的名称,导致不可见指针被取消引用.
但是,实现"现有变量的替代名称"的实体不一定需要为自己存储,即在编译语言中,它不需要由任何材料表示,如隐藏指针.这就是为什么语言标准在8.3.2中指出"未指明引用是否需要存储".
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |