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

隨筆-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.]

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

例如:

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

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

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

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. ]

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

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.

總結:
當產生臨時對象的完整表達式計算完時,臨時對象就會被析構

 

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.

總結:
有兩個情況下,不在完整表達式完成時析構。第一種情況是,當一個表達式出現在初始化式中時,當執行完初始化之后才會析構

例如: 

int main()
{
    X a,b;
    X c;
    cout 
<< "----------"<<endl;
    c
=a+b; // 臨時對象在對c進行完賦值后析構,即臨時對象在下面語句執行前析構
    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. ]

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

例如

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


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

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

posted on 2009-05-24 15:53 zhaoyg 閱讀(835) 評論(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>
            国产精品一区亚洲| 欧美韩日一区二区| 亚洲综合视频网| 久久黄色网页| 欧美国产日韩二区| 美女免费视频一区| 国产精品草莓在线免费观看| 国产日韩一区二区| 欧美国产综合| 欧美性猛交xxxx乱大交蜜桃| 激情久久久久| 亚洲免费成人av电影| 欧美亚洲视频在线看网址| 久久久综合免费视频| 欧美国产日韩一区| 欧美激情一区二区三区在线视频观看 | 国产日韩欧美综合一区| 久久久久久999| 一区二区三区视频免费在线观看| 亚洲第一天堂av| 亚洲免费电影在线观看| 夜夜嗨av一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 美女脱光内衣内裤视频久久影院| 国产精品成人播放| 亚洲国产日韩在线一区模特| 午夜精品久久久久| 一区二区三区鲁丝不卡| 国内精品久久久久久久果冻传媒| 一区在线免费| 日韩午夜在线观看视频| 欧美福利视频在线| 亚洲高清色综合| 久久久99国产精品免费| 亚洲国产一区二区精品专区| 激情综合自拍| 久久综合电影| 亚洲国产精品黑人久久久 | 久久不射网站| 欧美一区二视频在线免费观看| 久久国产精品99久久久久久老狼| 国产精品免费视频xxxx | 亚洲精品一区二区三区99| 一区二区三区欧美成人| 欧美日韩亚洲一区二区三区| 国产女人18毛片水18精品| 亚洲欧美视频在线观看视频| 免费精品99久久国产综合精品| 欧美日韩国内自拍| 亚洲影院色在线观看免费| 久久亚洲精选| 日韩天堂在线观看| 亚洲麻豆国产自偷在线| 亚洲国产成人午夜在线一区| 先锋影音久久久| 国户精品久久久久久久久久久不卡 | 欧美日韩精品不卡| 欧美.www| 欧美日本不卡高清| 亚洲在线观看视频网站| 欧美精品免费在线| 亚洲人成在线观看网站高清| 国产精品igao视频网网址不卡日韩| 亚洲在线免费观看| 欧美三级小说| 久久综合伊人77777| 一区二区三区久久网| 国产伦精品一区二区三区视频黑人 | 亚洲视频图片小说| 男人的天堂亚洲在线| 国产偷国产偷精品高清尤物| 亚洲尤物在线| 欧美激情中文字幕在线| 欧美激情一区二区久久久| 亚洲国产欧美一区二区三区同亚洲 | 久久久久久久精| 精品成人国产在线观看男人呻吟| 亚洲美女av电影| 亚洲社区在线观看| 国产精品日韩欧美| 亚洲在线观看视频| 久久久免费av| 亚洲欧美日韩国产中文| 理论片一区二区在线| 影音先锋久久久| 在线一区观看| 日韩一级黄色片| 国产精品国产三级国产aⅴ无密码| 久久亚洲精品一区二区| 91久久中文字幕| 欧美一区二区三区久久精品 | 国产精品xxxxx| 欧美大胆人体视频| 国产欧美精品日韩区二区麻豆天美| 欧美国产极速在线| 亚洲无线视频| 欧美激情自拍| 亚洲在线网站| 欧美激情一区二区三区不卡| 中文无字幕一区二区三区| 国产欧美日韩伦理| 中日韩视频在线观看| 猛男gaygay欧美视频| 美国三级日本三级久久99| 亚洲美女诱惑| 久久久噜噜噜久久人人看| 日韩视频一区二区三区在线播放免费观看| 性色av一区二区三区在线观看| 亚洲欧美国产高清| 欧美视频一二三区| 久久久久久久久久久成人| 日韩午夜精品| 麻豆国产va免费精品高清在线| 国外精品视频| 久久国产精品99精品国产| 亚洲黄色成人| 久热精品在线| 久久福利影视| 国外成人性视频| 国产精品国产三级国产专播精品人 | 亚洲午夜羞羞片| 亚洲综合社区| 亚洲精品美女91| 亚洲图片自拍偷拍| 欧美成人嫩草网站| 久久er精品视频| 亚洲一区二区在线| 日韩天堂在线观看| 亚洲福利国产精品| 国产偷国产偷精品高清尤物| 欧美日精品一区视频| 亚洲一区视频在线观看视频| 最新中文字幕亚洲| 亚洲一区自拍| 99热免费精品| 亚洲精品久久久久久下一站| 伊人成人网在线看| 国产一区二区三区久久久| 卡通动漫国产精品| 久久男女视频| 久久久久青草大香线综合精品| 免费短视频成人日韩| 久久午夜视频| aaa亚洲精品一二三区| 国产精品福利在线观看网址| 欧美高清你懂得| 欧美国产日韩a欧美在线观看| 亚洲视频在线看| 猫咪成人在线观看| 一区二区三区四区蜜桃| 欧美粗暴jizz性欧美20| 亚洲小说春色综合另类电影| 久久综合999| 免费日韩av| 欧美国产日本韩| 亚洲精品一区二区三区婷婷月 | 在线观看视频免费一区二区三区 | 久久国产精品毛片| 亚洲免费高清视频| 中文国产成人精品| 亚洲欧美激情精品一区二区| 欧美大片免费久久精品三p | 一区二区三区视频在线| 一区二区三区回区在观看免费视频| 国产一区二区0| 一区二区三区中文在线观看| 亚洲国产精品电影| 一区二区三区四区五区精品视频 | 国产精品高清网站| 欧美高清视频一区二区三区在线观看| 一本色道久久综合精品竹菊| 亚洲一区999| 久久久久成人精品免费播放动漫| 亚洲色图自拍| 欧美在线免费一级片| 99精品久久久| 亚洲欧美制服另类日韩| 亚洲视频国产视频| 久久激情一区| 欧美日韩精品一区视频| 国产日韩一区| 国产目拍亚洲精品99久久精品| 欧美吻胸吃奶大尺度电影| 国产一区在线看| 一区二区三区日韩在线观看| 久久久久se| 一区二区三区日韩精品| 亚洲精品美女在线观看播放| 午夜精品在线视频| 欧美精品18+| 在线观看欧美亚洲| 欧美一级二区| 久久国产婷婷国产香蕉| 亚洲精品国精品久久99热一| 亚洲国产精品热久久| 欧美一区国产在线| 国产精品久久久久一区| 亚洲日本成人女熟在线观看| 久久久不卡网国产精品一区| 这里是久久伊人|