typedef double real8;
typedef real8 Real_t;
Real_t& x(int y);
什么是Real_t&
??我只看到一个数据类型后跟“&”表示通过引用传递。但这是在声明行中。这是什么意思 ?
typedef double real8;
typedef real8 Real_t;
Real_t& x(int y);
什么是Real_t&
??我只看到一个数据类型后跟“&”表示通过引用传递。但这是在声明行中。这是什么意思 ?
这意味着该函数返回对 a 的引用,该引用Real_t
实际上是 a double
。如果你解析了所有的类型定义,那么它就是一个Real_t
。real8
double
你应该在这里小心。如果通过引用传递的结果不是从存在于函数末尾的作用域中检索到的,那么您将有一个悬空引用。
例如:
int& foo() {
int x = 8;
return x;
}
int main() {
int y = foo();
}
main 中的变量 ,y
最终引用了一个变量,该变量在返回时超出范围而被销毁foo()
,因此使用它是未定义的行为。如果x
从单例或函数范围之外的东西中检索到foo()
,那么它仍然存在,这很好。
人们有时会返回引用以在编译单元之间以确定性方式初始化静态全局变量,因此您可能会看到它与静态变量一起使用,例如:
MyClass& MyStaticVar() {
static MyClass instance;
return instance;
}
这也可以,因为静态在初始化后会在程序的持续时间内存在。
这意味着x
是一个返回对 a 的引用的函数Real_t
。
通过引用返回的一个例子是类中的数据访问。例如,std::vector::at()返回对向量元素的引用。
为了让自由函数安全地返回引用,函数内部必须发生一些不明显的事情,以确保不返回悬空引用。