金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  423 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
以下代码来自《Imperfect C++》

#include <stdio.h>

int main()
{
    
long l = 2222;
    
short const &= l;

    l 
= 0;
    printf(
"%ld, %d\n", l, s);
    
return 0;
}

输出是0, 2222还是0, 0?
按C++标准,引用s所指向的不是l,而是一个临时变量,所以输出应该是0, 2222。
posted on 2008-01-10 11:36 金庆 阅读(1738) 评论(11)  编辑 收藏 引用 所属分类: 1. C/C++

评论

# re: 对临时变量的引用 2008-01-10 14:07 <a href=http://minidx.com>minidxer</a>
这个你要注意的应该是const,而不是引用
改成
short const s = l;
输出的结果同样应该是0, 2222  回复  更多评论
  

# re: 对临时变量的引用 2008-01-10 14:17 <a href=http://minidx.com>minidxer</a>
另外金大虾如果可以对临时变量的生存周期做一下分析的话,那将会使很多人受益~  回复  更多评论
  

# re: 对临时变量的引用 2008-01-10 14:48 金庆
@&lt;a href=http://minidx.com&gt;minidxer&lt;/a&gt;
对临时变量的引用必须是const
如short & s = l;就会编译报错。
该临时变量在其定义的作用域内有效。

  回复  更多评论
  

# re: 对临时变量的引用 2008-01-10 15:11 <a href=http://minidx.com>minidxer</a>
呵呵,
★这样呢?
int main()
{
long l = 2222;
short *s = (short *)&l;

l = 0;
printf("%ld, %d\n", l, *s);
return 0;
}
★或者这样呢?
int main()
{
long l = 2222;
const short *s = (short *)&l;

l = 0;
printf("%ld, %d\n", l, *s);
return 0;
}

★下面结论对吗?
●const与生命周期无关
●const引用与生命周期有关
●const的引用会改变临时变量的生命周期
★问题:
●程序员能不能操作临时变量?
●临时变量被释放有固定时间点吗?
●临时性对象被绑定reference,那又会有什么不同?  回复  更多评论
  

# re: 对临时变量的引用 2008-01-11 10:07 金庆
@&lt;a href=http://minidx.com&gt;minidxer&lt;/a&gt;
minidxer想要引发我们对临时变量的思考。(或者是搅乱我们原来的认识?)
上述3个结论是正确的,只是第一个表述成这样更清晰:
const量与所赋值的生命周期无关
或者
const量与其他变量的生命周期无关

回答问题:
1. 无法操作临时变量
2. 临时变量会立即释放
3. 临时对量被引用后,不再临时

(再深入讨论可能会吓跑大批想学或正在学C++的朋友!)  回复  更多评论
  

# re: 对临时变量的引用 2008-01-11 10:44 <a href=http://minidx.com>minidxer</a>
呵呵,只是想借这篇文章展开一下,平时可能很少会去认真思考这些问题,本来还想在深入一些,不过看来只能到此为止了。:)
const只是一个编译期的概念,其实很多相关的东西都是和编译器有关的。
另外,
●临时变量是可以操作的,包括延长该变量的生命周期
●临时变量的释放和编译器有关,不一定马上释放

  回复  更多评论
  

# re: 对临时变量的引用 2008-01-29 12:57 eXile
在这个例子中,s所引用的临时变量的生命期和s的生命期是一致的。  回复  更多评论
  

# re: 对临时变量的引用[未登录] 2008-08-27 15:38 raof01
@&lt;a href=http://minidx.com&gt;minidxer&lt;/a&gt;
临时变量是可以操作的
如:
int main()
{
long l = 2222;
char const &s = l;
int *p = reinterpret_cast<int*>(const_cast<char *>(&s));
*p = 88;
printf("%ld, %c\n", l, s);
return 0;
}
  回复  更多评论
  

# re: 对临时变量的引用[未登录] 2008-08-27 15:39 raof01
能否操作临时变量,就看你有没有办法获取他的地址。  回复  更多评论
  

# re: 对临时变量的引用 2009-01-05 11:29 hying
&s指向的不是L,而是L经过类型转换后的一个值。这时候已经和L无关了。所以L变成0的时候&s还是指向2222。  回复  更多评论
  

# re: 对临时变量的引用[未登录] 2009-09-02 11:21 name
大家试没试过
int main()
{
long l = 2222;
long const &s = l;

l = 0;
printf("%ld, %d\n", l, s);
return 0;
}
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理