我们都熟悉通过引用返回:
//global
int x;
int& getElX()
{
return x;
}
因为该函数返回int &
类型,为什么不必说return (int&)X
?
再次,我理解返回引用是如何工作的。这是一个主要是语法
的问题此外,如果您执行return (int&)x
,意义是否会改变?
答案 0 :(得分:10)
int&
可以绑定到int
类型的左值。如果返回的表达式已经是类型int
的左值,则不需要强制转换。如果返回的表达式是某些其他类型的,无法直接用于初始化int&
,那么将需要强制转换。
(int&)v[x]
的含义不会改变:因为强制转换的操作数已经是int
类型的左值,所以强制转换没有效果。
答案 1 :(得分:4)
表达式 <p>{{average(items)}}</p>
相当于v[x]
,它调用函数v.operator[](x)
,现在vector<int>::reference vector<int>::operator[](size_t)
是vector<int>::reference
的typedef。函数返回类型'lvalue-reference to int'的函数调用表达式是'int'类型的'左值表达式'。
statetment int&
使用表达式return v[x]
初始化函数的返回值,返回类型为'lvalue-reference to int',左值引用只能使用兼容的左值表达式初始化类型,v[x]
是。现在,表达式v[x]
将(int&)v[x]
转换为它已经存在的'int value'类型的左值,因此它什么都不做。
注意:v[x]
返回的引用实体的生命周期最多是调用它的向量的生命周期,(在编辑之前)这是参数vector<int>::operator[](size)
的生命周期。从执行函数开始直到它结束,这是在执行v
语句时发生的。因此,函数返回的引用实体已经过期,这意味着访问它是未定义的(即不要这样做)。
答案 2 :(得分:-1)
出于同样的原因,你不必写:
int x = 2;
int& ref = (int&)x;