青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-59  評論-36  文章-0  trackbacks-0
看了如下的文字,對臨時對象有了一些初步了解。

摘自 ISO C++ 2003      P191

12.2 Temporary Object

 

1 Temporaries of class type are created in various contexts: binding an rvalue to a reference (8.5.3), returning an rvalue (6.6.3), a conversion that creates an rvalue (4.1, 5.2.9, 5.2.11, 5.4), throwing an exception (15.1), entering a handler (15.3), and in some initializations (8.5). [Note: the lifetime of exception objects is described in 15.1.] Even when the creation of the temporary object is avoided (12.8), all the semantic restrictions must be respected as if the temporary object was created. [ Example: even if the copy constructor is not called, all the semantic restrictions, such as accessibility (clause 11), shall be satisfied.]

總結(jié):
臨時對象產(chǎn)生于引用綁定右值、函數(shù)返回右值、轉(zhuǎn)換、拋出異常以及一些初始化試。
注,即使有些臨時對象可以被優(yōu)化掉,但語義的要求必須滿足

例如:

class X 
{
public:
    X (
const X &a); // No copy constructor definition
}
;

X f()
{
    X one;
    
return one;
}

int main()
{
    X one 
= f();  // VC2005中,release編譯時盡管優(yōu)化掉了復制構(gòu)造,但仍需要復制構(gòu)造的存在以滿足語義要求
}

2 [Example:

class X {
// ...
public:
// ...

X(int);
X(const X&);
˜X();
};

X f(X);
void g()
{
X a(1);
X b = f(X(2));
a = f(a);
}

Here, an implementation might use a temporary in which to construct X(2) before passing it to f() using X’s copy-constructor; alternatively, X(2) might be constructed in the space used to hold the argument. Also, a temporary might be used to hold the result of f(X(2)) before copying it to b using X’s copyconstructor; alternatively, f()’s result might be constructed in b. On the other hand, the expression a=f(a) requires a temporary for either the argument a or the result of f(a) to avoid undesired aliasing of a. ]

總結(jié):
對于f(X(2))這樣形式的參數(shù)傳入和值的返回,并不一定必須產(chǎn)生臨時對象,然后由復制構(gòu)造來構(gòu)造,也可以直接在目標內(nèi)存中構(gòu)造(形參或接受返回值的對象的所在地址)。這就是說,可以不經(jīng)復制構(gòu)造而直接構(gòu)造對象,但如之前所說復制構(gòu)造必須存在。

3 When an implementation introduces a temporary object of a class that has a non-trivial constructor (12.1), it shall ensure that a constructor is called for the temporary object. Similarly, the destructor shall be called for a temporary with a non-trivial destructor (12.4). Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created. This is true even if that evaluation ends in throwing an exception.

總結(jié):
當產(chǎn)生臨時對象的完整表達式計算完時,臨時對象就會被析構(gòu)

 

4 There are two contexts in which temporaries are destroyed at a different point than the end of the full-expression. The first context is when an expression appears as an initializer for a declarator defining an object.In that context,the temporary that holds the result of the expression shall persist until the object’s initialization is complete. The object is initialized from a copy of the temporary; during this copying, an implementation can call the copy constructor many times; the temporary is destroyed after it has been copied, before or when the initialization completes. If many temporaries are created by the evaluation of the initializer, the temporaries are destroyed in reverse order of the completion of their construction.

總結(jié):
有兩個情況下,不在完整表達式完成時析構(gòu)。第一種情況是,當一個表達式出現(xiàn)在初始化式中時,當執(zhí)行完初始化之后才會析構(gòu)

例如: 

int main()
{
    X a,b;
    X c;
    cout 
<< "----------"<<endl;
    c
=a+b; // 臨時對象在對c進行完賦值后析構(gòu),即臨時對象在下面語句執(zhí)行前析構(gòu)
    cout << "----------"<<endl;
}



5 The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object to a subobject of which the temporary is bound persists for the lifetime of the reference except as specified below. A temporary bound to a reference member in a constructor’s ctor-initializer (12.6.2) persists until the constructor exits.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.A temporary bound to the returned value in a function return statement (6.6.3) persists until the function exits.In all these cases, the temporaries created during the evaluation of the expression initializing the reference, except the temporary to which the reference is bound,are destroyed at the end of the full-expression in which they are created and in the reverse order of the completion of their construction.If the lifetime of two or more temporaries to which references are bound ends at the same point, these temporaries are destroyed at that point in the reverse order of the completion of their construction. In addition, the destruction of temporaries bound to references shall take into account the ordering of destruction of objects with static or automatic storage duration (3.7.1, 3.7.2); that is, if obj1 is an object with static or automatic storage duration created before the temporary is created, the temporary shall be destroyed before obj1 is destroyed; if obj2 is an object with static or automatic storage duration created after the temporary is created, the temporary shall be destroyed after obj2 is destroyed.[Example:

class C {

// ...

public:
C();
C(int);
friend C operator+(const C&, const C&);
˜C();
};
C obj1;
const C& cr = C(16)+C(23);
C obj2;

the expression C(16) + C(23) creates three temporaries. A first temporary T1 to hold the result of the expression C(16), a second temporary T2 to hold the result of the expression C(23), and a third temporary T3 to hold the result of the addition of these two expressions. The temporary T3 is then bound to the reference cr.It is unspecified whether T1 or T2 is created first. On an implementation where T1 is created before T2, it is guaranteed that T2 is destroyed before T1. The temporaries T1 and T2 are bound to the reference parameters of operator+; these temporaries are destroyed at the end of the full expression containing the call to operator+. The temporary T3 bound to the reference cr is destroyed at the end of cr’s lifetime, that is, at the end of the program. In addition, the order in which T3 is destroyed takes into account the destruction order of other objects with static storage duration. That is, because obj1 is constructed before T3, and T3 is constructed before obj2, it is guaranteed that obj2 is destroyed before T3, and that T3 is destroyed before obj1. ]

總結(jié):
第二種情況是,當一個引用綁定臨時對象時,只有當引用或臨時對象超出作用域時析構(gòu)(因為當臨時對象被析構(gòu)后,指向該臨時對象的引用也就自然沒用了)

例如

int main()
{
    X a,b;
    cout 
<< "----------"<<endl;
    X 
&c=a+b;  // 臨時對象因被引用,故而延期析構(gòu)
    cout << "----------"<<endl;
     
return 0// 此時臨時對象析構(gòu)
}


另,發(fā)現(xiàn)對于指針,則完全沒有什么因臨時對象被“引用”而延長生命期這一說法

class T
{
int i;
public:
T()
{ i = 99; }
void show(){ cout << i<<endl; }
}
;
int main()
{
    T 
*p;
    cout 
<< "========="<<endl;
    p
=&f();  // f函數(shù)一旦調(diào)用完,臨時對象就被析構(gòu)
(*p).show(); // 輸出垃圾值
    cout << "========="<<endl;
    cout 
<< "return"<<endl;
}

posted on 2009-05-24 15:53 zhaoyg 閱讀(829) 評論(1)  編輯 收藏 引用 所屬分類: C/C++學習筆記

評論:
# re: {偶爾學習C++標準} 之 [初識臨時對象生命期] 2010-08-09 20:57 | 希望2012是真的,真心期待!!!
很不錯!!!!!!!  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品sm| 欧美性淫爽ww久久久久无| 国产午夜精品久久久久久免费视 | 国产欧美日韩亚州综合| 亚洲一区影音先锋| 亚洲一区二区视频在线| 国产热re99久久6国产精品| 久久青草久久| 麻豆国产精品一区二区三区| 一区二区三欧美| 亚洲性夜色噜噜噜7777| 一色屋精品视频在线观看网站| 欧美aaaaaaaa牛牛影院| 欧美日韩p片| 欧美一级精品大片| 久久久精品日韩欧美| 亚洲精品乱码视频| 亚洲午夜在线观看| 在线免费一区三区| 中文日韩电影网站| 亚洲成人在线视频播放| 亚洲精品中文字幕女同| 国产免费一区二区三区香蕉精| 久久伊伊香蕉| 欧美日本一区二区三区| 午夜精品久久久久久99热| 久久久久久久一区| 日韩亚洲综合在线| 老司机精品福利视频| 久久精品国产亚洲a| 亚洲美女精品久久| 欧美在线综合视频| 一本色道久久88综合日韩精品| 亚洲网友自拍| 亚洲日本欧美| 欧美一级专区| 亚洲午夜激情网页| 蜜乳av另类精品一区二区| 午夜精品一区二区在线观看| 美女图片一区二区| 欧美综合激情网| 欧美日韩另类视频| 欧美电影免费| 红桃视频欧美| 欧美一区二区三区免费大片| 在线视频精品一| 欧美mv日韩mv国产网站| 久久久久网址| 国产午夜一区二区三区| 亚洲一区www| 亚洲深夜av| 欧美成人福利视频| 欧美va天堂| 在线免费不卡视频| 欧美在线|欧美| 欧美专区在线播放| 国产精品永久入口久久久| av成人国产| 亚洲视频综合| 欧美午夜视频一区二区| 一个色综合av| 亚洲一区欧美激情| 国产精品乱码一区二区三区| 99精品免费| 亚洲午夜久久久| 欧美性猛交一区二区三区精品| 日韩视频免费| 亚洲一区二区三区在线观看视频| 欧美交受高潮1| 亚洲免费大片| 午夜在线观看免费一区| 国产欧美精品一区aⅴ影院| 午夜久久福利| 玖玖国产精品视频| 亚洲人精品午夜| 欧美日本一道本| 亚洲一区www| 久久久久久夜精品精品免费| 国内伊人久久久久久网站视频| 久久精品国产2020观看福利| 久久人人97超碰人人澡爱香蕉| 国内精品久久久久久久果冻传媒| 久久久久五月天| 亚洲第一精品影视| 亚洲视频免费在线| 国产乱码精品一区二区三区av| 久久9热精品视频| 欧美激情亚洲另类| 亚洲一区在线看| 国产综合网站| 欧美激情综合五月色丁香| 一区二区三区蜜桃网| 久久久久久久精| 99re6这里只有精品视频在线观看| 欧美日韩午夜在线| 欧美一区二区在线观看| 亚洲成人资源网| 亚洲欧美日韩在线高清直播| 国产亚洲制服色| 欧美日韩国产在线播放| 午夜精品免费视频| 亚洲国产精品毛片| 欧美在线free| 亚洲免费观看| 国产一区二区精品丝袜| 欧美激情在线播放| 欧美一级视频精品观看| 亚洲精品日日夜夜| 久久青草欧美一区二区三区| 在线一区日本视频| 亚洲国产一二三| 国产欧美一区二区三区另类精品 | 欧美激情第10页| 午夜国产不卡在线观看视频| 亚洲级视频在线观看免费1级| 羞羞答答国产精品www一本| 91久久线看在观草草青青| 国产色综合久久| 欧美午夜一区二区三区免费大片| 久久久久久久久久看片| 午夜精品网站| 亚洲视频axxx| 一本大道久久a久久精品综合| 欧美好骚综合网| 久久手机精品视频| 欧美在线观看网址综合| 亚洲性视频h| 99视频热这里只有精品免费| 在线日韩成人| 国产尤物精品| 国产偷国产偷精品高清尤物| 国产精品美女久久福利网站| 欧美日韩精品在线播放| 欧美大片在线观看一区| 裸体歌舞表演一区二区| 久久蜜桃精品| 鲁大师成人一区二区三区| 久久精品一区二区三区四区| 欧美伊人久久| 久久精品国产免费| 久久九九热re6这里有精品| 欧美一区激情| 久久久91精品国产一区二区三区 | 欧美日韩国产三级| 欧美日韩午夜| 国产精品免费观看在线| 国产精品视频免费观看www| 国产精品久久久久久模特| 国产精品videossex久久发布| 欧美体内谢she精2性欧美| 欧美日韩免费网站| 国产精品久久久久久影视| 国产精品视频免费观看| 国产一区 二区 三区一级| 国产一区二区精品丝袜| 在线欧美视频| 99视频精品全部免费在线| 亚洲一区二区精品在线| 午夜精品久久久久| 久久影院午夜论| 亚洲电影免费| 国产精品99久久久久久人| 亚洲欧美日韩成人高清在线一区| 午夜在线电影亚洲一区| 久久青青草综合| 欧美精品v国产精品v日韩精品| 欧美午夜精品一区二区三区| 国产一区欧美| 亚洲精品一区二区三区婷婷月 | 亚洲综合视频1区| 久久精品国产一区二区电影| 欧美a级片网站| 亚洲最新合集| 久久精品免视看| 欧美日韩中文字幕日韩欧美| 国产亚洲成av人片在线观看桃| 亚洲国产日韩一区二区| 亚洲欧美精品伊人久久| 久久婷婷国产麻豆91天堂| 亚洲国产欧美不卡在线观看| 一区二区三区日韩| 久久天天狠狠| 国产精品久久久999| 亚洲国产欧美久久| 亚洲欧美日韩国产精品| 欧美成人亚洲成人| 亚洲欧美成人一区二区在线电影 | 欧美成人黄色小视频| 国产精品色在线| 亚洲乱亚洲高清| 久久精品亚洲一区二区三区浴池| 亚洲第一网站免费视频| 欧美亚洲综合另类| 欧美日韩爆操| 亚洲破处大片| 免费一区视频| 久久国产视频网| 国产欧美日韩亚洲精品| 亚洲视频一二| 亚洲丁香婷深爱综合|