关于const引用做为形参的疑惑。
当函数形参是一个const引用的时候,是否产生临时对象?
double a = 1.34 ;
const int &b = a ;
const int &c = 1024 ;
在上面的const引用中都产生了临时变量,然后引用变量指向该临时变量。
在函数传递中,比如:
class X {};
X f() { return X(); }
void g1(X&) {}
void g2(const X&) {}
int main() {
g1(f()) ;
g2(f());
return 0;
}
因为在f()函数返回的是一个临时变量,因此f()函数结束的时候这个临时变量的生命期也应该
结束了。因此g1的调用是非法的,至于g2则因为是const引用,所以产生了另一个临时变量。
g2的调用是可以的。
那么我现在的疑问是,如果传给g2的是一个正常的对象,会产生临时变量吗?难道只有在传递的
对象是常量,或者临时变量的时候const引用才自动的产生另一个临时变量?
如果不管传递的是什么对象,const引用都会产生临时变量,那么和值传递应该没有什么区别了,
都应该需要一个临时对象的构造拷贝析构过程,也就没有了快速的优点。
事实到底是怎么样子的?
double a = 1.34 ;
const int &b = a ;
const int &c = 1024 ;
在上面的const引用中都产生了临时变量,然后引用变量指向该临时变量。
在函数传递中,比如:
class X {};
X f() { return X(); }
void g1(X&) {}
void g2(const X&) {}
int main() {
g1(f()) ;
g2(f());
return 0;
}
因为在f()函数返回的是一个临时变量,因此f()函数结束的时候这个临时变量的生命期也应该
结束了。因此g1的调用是非法的,至于g2则因为是const引用,所以产生了另一个临时变量。
g2的调用是可以的。
那么我现在的疑问是,如果传给g2的是一个正常的对象,会产生临时变量吗?难道只有在传递的
对象是常量,或者临时变量的时候const引用才自动的产生另一个临时变量?
如果不管传递的是什么对象,const引用都会产生临时变量,那么和值传递应该没有什么区别了,
都应该需要一个临时对象的构造拷贝析构过程,也就没有了快速的优点。
事实到底是怎么样子的?
...全文
相关推荐
老生常谈C++中实参形参的传递问题
下面小编就为大家带来一篇老生常谈C++中实参形参的传递问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
c++中的引用和形参
c++中的引用和形参的问题,非常适合那些混沌的同学!
C++ const引用、临时变量 引用参数详解
C++引用—临时变量、引用参数和const引用 如果实参与引用参数不匹配,C++将生成临时变量。如果引用参数是const,则编译器在下面两种情况下生成临时变量: 实参类型是正确的,但不是左值 实参类型不正确,但可以转换为正确的类型 左值参数是可被引用的数据对象,例如,变量、数组元素、结构成员、引用和被解除引用的指针都是左值,非左值包括字面常量和包含多项式的表达式。定义一个函数 Double refcube(const double& ra) { Returnra*ra*ra; } double side = 3.0; double* pd = &side; double& rd
C++常量详解二(常量形参,常量返回值,常量成员函数)
主要介绍了C++常量详解二(常量形参,常量返回值,常量成员函数),需要的朋友可以参考下
浅析C++的引用与const指针与各种传递方式
主要介绍了浅析C++的引用与const指针与各种传递方式的相关资料,需要的朋友可以参考下


