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

隨筆-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>
            久久精品国产免费观看| 欧美亚洲系列| 欧美激情1区2区3区| 久久精品视频播放| 在线观看成人av| 欧美国产日产韩国视频| 欧美成人69av| 亚洲视频欧美在线| 一区二区三区三区在线| 国产精品日韩欧美| 久久露脸国产精品| 老司机凹凸av亚洲导航| 亚洲精品国精品久久99热| 亚洲精品字幕| 国产日韩一区二区三区| 久久视频精品在线| 欧美国产日韩一区| 亚洲欧美日韩一区在线观看| 欧美一区国产一区| 亚洲日韩欧美视频一区| 亚洲性感美女99在线| 狠狠综合久久| 亚洲美女少妇无套啪啪呻吟| 国产日产欧产精品推荐色| 鲁鲁狠狠狠7777一区二区| 免费一级欧美在线大片| 亚洲欧美激情在线视频| 久久人91精品久久久久久不卡| 一区二区三区久久网| 午夜精品久久一牛影视| 亚洲美女诱惑| 欧美在线观看网站| 中文一区二区| 久久字幕精品一区| 亚洲一二三级电影| 美女日韩欧美| 久久精品国产一区二区三区| 欧美精品一区二区三区久久久竹菊| 午夜天堂精品久久久久| 欧美高清一区二区| 久久综合成人精品亚洲另类欧美| 欧美日韩一区二区三区四区在线观看| 久久影音先锋| 国产精品亚洲综合| 亚洲美女少妇无套啪啪呻吟| 影音先锋日韩资源| 欧美一乱一性一交一视频| 一区二区国产在线观看| 每日更新成人在线视频| 久久久福利视频| 国产精品播放| 日韩视频免费观看高清完整版| 一区二区亚洲精品国产| 亚洲欧美日韩综合aⅴ视频| aa级大片欧美| 欧美激情亚洲另类| 麻豆av一区二区三区| 韩国福利一区| 久久成人在线| 久久影视精品| 极品日韩av| 久久婷婷国产综合国色天香| 久久久久久久97| 国模吧视频一区| 欧美一区二区三区在线观看| 午夜亚洲伦理| 国产视频欧美视频| 欧美一区二区三区精品| 久久久青草青青国产亚洲免观| 国产精品欧美久久久久无广告| 亚洲深夜av| 欧美在线影院| 国产在线日韩| 玖玖在线精品| 亚洲国产成人av在线| 亚洲黄色免费电影| 欧美日韩国产限制| 亚洲无吗在线| 久久一区二区三区av| 伊人影院久久| 欧美久久精品午夜青青大伊人| 亚洲国产成人av| 亚洲影院一区| 国产亚洲欧美日韩在线一区| 久久精品亚洲一区| 亚洲国产小视频| 亚洲网站啪啪| 国产一区二区精品丝袜| 美女免费视频一区| 亚洲精品中文字| 欧美专区亚洲专区| 亚洲国产高清视频| 欧美日韩国产欧| 欧美亚洲三区| 欧美激情一区二区三区不卡| 宅男噜噜噜66一区二区| 国产精品午夜在线| 鲁大师成人一区二区三区| 99国产麻豆精品| 久热爱精品视频线路一| 日韩网站在线观看| 国产精品一区一区| 欧美国产日韩一二三区| 亚洲女人天堂av| 亚洲韩国精品一区| 欧美怡红院视频| 一本色道久久综合狠狠躁的推荐| 国产精品天美传媒入口| 欧美1区2区视频| 西西人体一区二区| 日韩视频精品在线观看| 麻豆精品精品国产自在97香蕉| 亚洲色图自拍| 1024日韩| 国产性天天综合网| 欧美精选午夜久久久乱码6080| 欧美一级淫片aaaaaaa视频| 亚洲免费观看视频| 免费人成精品欧美精品| 欧美一区二区三区啪啪| 一本色道久久加勒比88综合| 在线观看中文字幕亚洲| 国产精品美女久久久久av超清 | 欧美有码在线观看视频| 亚洲黄网站黄| 美女免费视频一区| 久久精品在这里| 欧美一级艳片视频免费观看| 亚洲免费观看| 亚洲国产日韩欧美| 精品电影在线观看| 国产一区二区欧美| 国产日本亚洲高清| 国产精品欧美在线| 国产精品九九| 国产精品ⅴa在线观看h| 欧美日韩成人在线播放| 欧美精品国产精品日韩精品| 噜噜噜久久亚洲精品国产品小说| 久久久久国产精品午夜一区| 亚洲欧美一区二区精品久久久| 亚洲视频久久| 亚洲一区二区三区在线看 | 欧美综合国产精品久久丁香| 亚洲自拍偷拍色片视频| 一区二区三区欧美| 一区二区三区精密机械公司| 一本久久综合亚洲鲁鲁| 一区二区三区四区五区在线| 日韩亚洲精品电影| 99综合在线| 亚洲无人区一区| 午夜精品婷婷| 久久精品国产99国产精品| 久久久精品欧美丰满| 噜噜噜久久亚洲精品国产品小说| 老鸭窝毛片一区二区三区| 欧美jizzhd精品欧美巨大免费| 欧美福利电影网| 最新成人av网站| 亚洲性人人天天夜夜摸| 午夜视频一区二区| 久久欧美中文字幕| 欧美母乳在线| 国产日韩欧美二区| 在线观看成人av| 一区二区三区四区在线| 午夜免费久久久久| 你懂的视频欧美| av成人毛片| 久久精品一区二区国产| 欧美成人免费播放| 国产精品日韩精品| 在线观看日韩| 亚洲永久精品国产| 麻豆久久婷婷| 亚洲精品影院| 欧美一区二区在线看| 欧美激情一区二区三区在线视频观看| 欧美午夜精品久久久久久浪潮| 国产日韩欧美高清| 亚洲精品在线观| 久久精品欧美| 99国产精品久久久久老师| 久久丁香综合五月国产三级网站| 欧美精品成人| 国内精品嫩模av私拍在线观看| 一区二区日韩免费看| 久久亚洲色图| 亚洲免费人成在线视频观看| 嫩模写真一区二区三区三州| 国产精品欧美日韩| 99视频精品全部免费在线| 久久久99久久精品女同性| 亚洲精品一区二区三区av| 久久久久久亚洲精品杨幂换脸| 国产精品爱啪在线线免费观看| 亚洲国产专区校园欧美| 欧美一区二区三区婷婷月色| 亚洲精品日韩一|