在这些案件中如何处理参考?

时间:2010-12-01 09:46:51

标签: c++ compiler-construction reference

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

//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;
}

3 个答案:

答案 0 :(得分:1)

在第一种情况下,当引用是全局的时,它会将全局num指向源文件的末尾。第二种情况,当ref在someFunc1时,它会将num指向someFunc1的结尾。你不应该像在最后一种情况那样做,因为num会在someFunc2的末尾被销毁,所以如果你在外面使用它就会出现分段错误。

答案 1 :(得分:1)

  

然后参考将是指示物   本身并不一定是指针   它呢

从语义上讲,引用总是(对象本身的名称),而永远不会指向它的指针。

在实现方面,无法保证如果函数内联,则不会使用指针。也无法保证全局变量或局部变量。您的someFunc2()会创建一个悬挂引用,但行为未定义。

在所有三种有效情况下(内联,全局,本地),编译器可能会避免使用额外的空间来存储指针,但是如果要创建明确的语句,则需要选择编译器并检查其内部。对于具有外部链接的全局,显然可执行格式也必须允许它。

答案 2 :(得分:1)

DavidRodríguez - dribeas在评论中已经指出,该标准给编译器提供了相当多的自由度,当涉及到引用时。他们可能会或可能不会占用空间;它们本身并不是适当的物体等。

您为引用类型的函数参数描述的行为(在内联期间消除)对于编译器在引用时具有的自由度是典型的。但这是一种自由,而不是对他们的义务。它可能并不总是可能:当你调用SomeFunc( a>5 ? foo : bar);时,编译器无法用“the”引用本身替换引用。

您的其他示例同样不受约束。理论上,可以优化全局和局部引用,因为没有任何东西可以阻止它。最后一个示例可以完全内联为exit(NasalDemons());,因为您将返回对超出范围的对象的引用。