我知道当一个引用是函数的参数并且该函数被内联时,引用本身就可能是引用本身而不一定是指向它的指针,但是当引用不是参数时呢?但它是函数或全局的局部函数,或者是内联函数的输出:
//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;
}
答案 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());
,因为您将返回对超出范围的对象的引用。