在这些情况下将如何处理参考?

问题描述 投票:0回答:3

我知道当引用是函数的参数并且该函数是内联的时,那么引用可能是引用对象本身,而不一定是指向它的指针,但是当引用不是参数而是引用时呢?函数的局部或全局,或者是内联函数的输出:

//global scope

void someFunc(SomeType & ref){//when function is inline, it's possible for ref to be the referent itself
 //function body
}
int num=7;
int & ref=num;//what about ref here?
void someFunc1(){
 int num=6;
 int & ref=num;//what about ref here?
 //rest of function body
}
int & someFunc2(){//what about output reference here when function is inlined, will it be num itself or a pointer ?
 int num=8;
 return num;
}
c++ reference
3个回答
1
投票

David Rodríguez - dribeas 已经在评论中指出,在引用方面,该标准为编译器提供了相当大的自由度。它们可能占用空间,也可能不占用空间;它们本身不是适当的对象,等等。

您为引用类型的函数参数描述的行为(在内联期间消除)是编译器在引用时拥有的自由度的典型表现。但这对他们来说是一种自由,而不是义务。它也可能并不总是可能的:当您调用

SomeFunc( a>5 ? foo : bar);
时,编译器无法用“the”引用本身替换引用。

您的其他示例同样不受约束。理论上,全局和局部引用可以被优化,因为没有什么可以阻止它。最后一个示例可以完全内联为

exit(NasalDemons());
,因为您返回的是对超出范围的对象的引用。


1
投票

在第一种情况下,当引用是全局的时,它将把全局编号指向源文件的末尾。第二种情况,当 ref 位于

someFunc1
时,它将把 num 指向
someFunc1
的末尾。你不应该像最后一种情况那样做,因为 num 会在
someFunc2
结束时被销毁,所以如果你在外面使用它,你会遇到分段错误。


1
投票

那么引用将是指称对象 本身而不一定是指针 到它

从语义上讲,引用是always(对象本身的名称),并且never是指向它的指针。

在实现方面,不能保证如果函数是内联的,则不会使用指针。也不保证全局或局部变量。您的

someFunc2()
创建了一个悬空引用,具有未定义的行为。

在所有三种有效情况(内联、全局、本地)中,编译器很可能会避免使用额外的空间来存储指针,但如果您想做出明确的语句,那么您需要选择一个编译器并检查其内部结构。在具有外部链接的全局的情况下,显然可执行格式也必须允许它。

© www.soinside.com 2019 - 2024. All rights reserved.