亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2440 | 回復: 6
打印 上一主題 下一主題

[C++] const 引用與臨時變量的問題 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-05-14 10:57 |只看該作者 |倒序瀏覽
本帖最后由 Frahm 于 2013-05-14 10:59 編輯
  1. const int& fwd(const int& i) {
  2.   return i;
  3. }
  4. const Foo& fwd(const Foo& f) {
  5.   return f;
  6. }
  7. int main() {
  8.   const int& ir = fwd(4); //1
  9.   const Foo& fr = fwd(Foo());//2
  10. }
復制代碼
看上面的2,fr應該是dangling reference, ir也是嗎?在1的地方傳入的參數(shù)4是傳拷貝還是引用呢?還有那個4的有效lifetime是什么?

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設計版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀念徽章
日期:2015-12-22 16:50:40IT運維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術圖書徽章
日期:2016-07-19 13:54:03程序設計版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
2 [報告]
發(fā)表于 2013-05-14 15:43 |只看該作者
我的理解:引用的實現(xiàn)也是通過指針,返回臨時對象的const 引用,雖然臨時對象銷毀了,但是引用通過地址取到“對象”
樓主可以參考下面代碼調試:
  1. #include <iostream>  
  2. #include <fstream>  
  3. #include <string>  
  4. #include <cstdio>
  5. #include <cstring>
  6. using namespace std;  
  7.   
  8. class Foo{
  9. public:
  10.         Foo():n(321){ printf("Foo(): %d %p\n", n, this); }
  11.         ~Foo(){ n = 0; std::cout << "~Foo()\n"; }
  12.         void *display() const { printf("Foo().display(): %d %p\n", n, this); return (void*)this; }
  13. private:
  14.         int n;
  15. };

  16. const int& fwd(const int& i) {
  17.         return i;
  18. }

  19. const Foo& fwd(const Foo& f) {
  20.         return f;
  21. }

  22. int main() {
  23.         const int& ir = fwd(4); //1
  24.         const Foo& fr = fwd(Foo());//2
  25.         Foo *pf = (Foo*)fr.display();
  26.         new (pf)Foo();
  27.         fr.display();
  28.         getchar();
  29. }
復制代碼

論壇徽章:
0
3 [報告]
發(fā)表于 2013-05-14 16:11 |只看該作者
回復 3# cokeboL

輸出:
Foo(): 321 006DF850
~Foo()
Foo().display(): 0 006DF850
Foo(): 321 006DF850
Foo().display(): 321 006DF850

看得出來,fr是dangling reference,我想知道關于ir是怎樣的?

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設計版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀念徽章
日期:2015-12-22 16:50:40IT運維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術圖書徽章
日期:2016-07-19 13:54:03程序設計版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
4 [報告]
發(fā)表于 2013-05-14 16:44 |只看該作者
回復 4# Frahm

這個帖子或許有點幫助。。。我陣亡了,語法真要命,我不搞了,哈哈哈

    http://www.cnblogs.com/soaliap/archive/2012/11/19/2777131.html

論壇徽章:
0
5 [報告]
發(fā)表于 2013-05-14 19:34 |只看該作者
回復 5# cokeboL


    那個講的是右值引用,我這個問題不涉及c++11,不過還是多謝。

論壇徽章:
0
6 [報告]
發(fā)表于 2013-05-14 21:55 |只看該作者
本帖最后由 rosynirvana 于 2013-05-14 22:19 編輯

c++ primer 6.2
Parameter initialization works the same way as variable initialization.
When a parameter is a reference, we say that its corresponding argument is "passed by reference" of theat the function is "called by reference".
所以是傳參


下面引用的是c++標準,網(wǎng)上找的2005-10-19的那份草稿

literal沒有l(wèi)ifetime的概念。
const int& foo= 42;
實際上是 int temp =42; const int& foo= temp; (8.5.3)
temp這個臨時變量有l(wèi)ifetime,是
A temporary bound to a reference parameter in a function call (5.2.2) persists until the completion of the full expression containing the call. (12.2.5)

同樣12.2.5
A temporary bound to a reference member in a constructor’s ctor-initializer (12.6.2) persists until the constructor exits.
可以知道1的臨時變量在構造函數(shù)返回后銷毀

不過用引用來初始化引用正確嗎?我自己都要被繞暈了…退散了…

論壇徽章:
0
7 [報告]
發(fā)表于 2013-05-14 22:28 |只看該作者
本帖最后由 Frahm 于 2013-05-14 22:31 編輯

回復 7# rosynirvana


    也就是4被傳入的時候是拷貝的?所以ir也引用到了過期的int?
可以這樣想,返回類型是const T&,所以也就是一個const T& 綁定到返回值上,接收返回值的一方正是const T&類型,所以綁定到了函數(shù)內(nèi)的返回值上了,不過在語句執(zhí)行完就已經(jīng)被析構了,所以是dangling reference
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP