为何这个临时变量是常量?

xinxiakk 2005-02-28 10:31:50
在C++编程思想里,有这么一段,不太理解,请指教:
由于引用的语法(看起来像值传递)的原因,传递一个临时对象给带有一个引用的函数,
是可能的,但不能传递一个临时对象给带有一个指针的函数—因为它必须清楚地带有地址。
所以,通过引用传递会产生一个在C中不会出现的新情形:一个总是常量的临时变量,它的地
址可以被传递给一个函数。这就是为什么临时变量通过引用被传递给一个函数时,这个函数的
参数一定是常量(c o n s t)引用。下面的例子说明了这一点:
class{};
X f(){return X();}//return by value

void g1(X&) {}//Pass by non-const reference
void g2(const X&){}//Pass by const reference
main(){
//Error:const temporary created by f();
//! g2(f());
//OK:g2 takes a const reference;
g2(f());
}
函数f()返回类X的一个对象的值。这意味着立即取f()的返回值并把它传递给其他函数时
(正如g1()和g2()函数的调用),建立了一个临时变量,那个临时变量是常量。这样,函数g1()中
的调用是错误的,因为g1()不带一个常量(const)引用,但是函数g2()中的调用是正确的。
...全文
181 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjh1982 2005-02-28
  • 打赏
  • 举报
回复
这本书垃圾到这样了?真不知道说些什么
临时变量只能被const 传递是为了侦察逻辑错误:函数改了数据改的却是临时的变量,该变量马上析购使得更改毫无意义
really168 2005-02-28
  • 打赏
  • 举报
回复
呵呵,我也看这本书哦,呵呵,也没怎么理解,但也知道一点,呵呵,UP,但说不清楚哦,呵呵
ghwangtongji 2005-02-28
  • 打赏
  • 举报
回复
//为何这个临时变量是常量?
编译器规定临时变量为常量啊
就像char *p="ABC";一样,编译器长生字符串常量"ABC",
并将其分配于静态存储区域,不能对齐进行修改
dongpy 2005-02-28
  • 打赏
  • 举报
回复
临时对象不能作为LVALUE
===============
这句话好像值得商榷!
举个例子:
#include <iostream.h>
class CComplex
{
private:
int x;
public:
CComplex(){}
CComplex(int x1)
{
x=x1;
}
friend CComplex operator+(CComplex &cp1,CComplex &cp2);
};
CComplex operator+(CComplex &cp1,CComplex &cp2)
{
CComplex cp3;
cp3.x=cp1.x+cp2.x;
return cp3;
}
int main()
{
CComplex a(2),b(3),c(4);
(a+b) = c ; //临时对象作为左值
return 0;
}
//上面代码在VC6和GCC上都没问题!
dongpy 2005-02-28
  • 打赏
  • 举报
回复
晕了,我用VC6调用g1(f());也没错!
请问楼主,这段话在第几页呀?
goodluckyxl 2005-02-28
  • 打赏
  • 举报
回复
临时对象不能作为LVALUE
非const -> const转化是默认进行的
const -> 非const转化是需要强制进行

dongpy 2005-02-28
  • 打赏
  • 举报
回复
这段话真是不好理解

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧