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

隨筆-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是真的,真心期待!!!
很不錯!?。。。。。?nbsp; 回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲黄色小视频| 亚洲激情视频网| 欧美激情自拍| 欧美一区二区三区在线视频| 欧美日韩午夜精品| 亚洲国产精品电影| 欧美电影免费观看网站| 欧美成人四级电影| 一区二区三区高清在线| 亚洲图片激情小说| 精品不卡在线| 日韩手机在线导航| 国产精品日本精品| 亚洲国产mv| 欧美成人首页| 国产精品第三页| 久久综合一区二区三区| 久久综合色婷婷| 亚洲欧美激情视频在线观看一区二区三区| 一区二区三区四区蜜桃| 国产精品麻豆欧美日韩ww| 久久青草欧美一区二区三区| 国产午夜精品全部视频播放 | 亚洲美女诱惑| 欧美在线视频免费播放| 宅男精品视频| 欧美激情中文字幕在线| 免费在线观看日韩欧美| 国内精品久久久久国产盗摄免费观看完整版 | 亚洲午夜影视影院在线观看| 亚洲电影在线免费观看| 欧美中文字幕不卡| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久人人97超碰精品888| 亚洲欧美亚洲| 国产老女人精品毛片久久| 亚洲乱码国产乱码精品精可以看| 国产在线不卡精品| 午夜精品一区二区三区在线视| 一本色道久久综合狠狠躁篇的优点| 久久久久久久一区| 免费日韩成人| 91久久国产精品91久久性色| 久久综合九色综合欧美狠狠| 快she精品国产999| 欧美亚洲视频在线观看| 午夜精品国产| 国内精品久久久久久久影视麻豆| 亚洲一级黄色av| 久久精品91久久久久久再现| 国产日韩精品一区二区三区| 欧美亚洲一区| 亚洲国产成人精品视频| 日韩网站在线看片你懂的| 国产精品盗摄久久久| 性做久久久久久免费观看欧美| 久久免费视频观看| 日韩视频免费| 激情六月婷婷久久| 欧美日韩国产二区| 久久久久久91香蕉国产| 最新日韩欧美| 美女91精品| 欧美一区二区精品| 99精品久久久| 亚洲激情网站| 韩国在线一区| 国产偷国产偷亚洲高清97cao| 欧美激情一区二区| 久久久久九九九| 亚洲欧美日韩第一区| 日韩一区二区电影网| 亚洲第一精品夜夜躁人人躁| 久久蜜桃精品| 鲁大师成人一区二区三区| 欧美一区二区日韩| 亚洲一区二区三区国产| 亚洲精品乱码久久久久久按摩观| 国产午夜亚洲精品不卡| 欧美性jizz18性欧美| 欧美体内she精视频| 欧美久久视频| 欧美日韩国产一区二区| 欧美日韩在线直播| 国产精品九色蝌蚪自拍| 日韩视频免费观看高清完整版| 亚洲第一综合天堂另类专| 可以看av的网站久久看| 欧美黄色免费| 亚洲另类在线视频| 亚洲一级电影| 免费成人高清视频| 欧美视频一区在线观看| 国产午夜一区二区三区| 亚洲缚视频在线观看| 亚洲巨乳在线| 久久久久久亚洲精品杨幂换脸| 美日韩精品视频| 中文亚洲免费| 乱中年女人伦av一区二区| 欧美日韩综合一区| 在线观看视频一区| 亚洲欧美日韩精品久久久久| 免费观看成人鲁鲁鲁鲁鲁视频 | 国产一区日韩一区| 99视频精品免费观看| 久久先锋影音av| 亚洲精品国产精品久久清纯直播| 亚洲午夜小视频| 欧美日韩和欧美的一区二区| 亚洲精品欧美一区二区三区| 欧美伊人精品成人久久综合97| 欧美高清在线视频观看不卡| 老牛嫩草一区二区三区日本| 亚洲精品国产品国语在线app | 欧美黑人多人双交| 亚洲一区二区成人| 国产精品午夜电影| 国产精品爱久久久久久久| 欧美日韩免费在线观看| 欧美一区国产在线| 欧美在线视频免费播放| 一区二区视频欧美| 一本一本a久久| 日韩视频免费在线观看| 欧美日韩精品在线| 亚洲一区在线观看视频| 国产精品99久久99久久久二8 | 亚洲麻豆av| 亚洲国产精品国自产拍av秋霞| 久久综合伊人77777尤物| 国产精品99久久久久久宅男| 国产精品久久9| 久久久综合网| 欧美~级网站不卡| 亚洲午夜在线视频| 午夜视频一区二区| 精品成人a区在线观看| 亚洲黄色尤物视频| 欧美性视频网站| 欧美xart系列高清| 欧美性视频网站| 欧美国产乱视频| 国产农村妇女精品一区二区| 欧美韩日亚洲| 国外成人性视频| 亚洲天堂成人在线视频| **性色生活片久久毛片| 9l国产精品久久久久麻豆| 在线观看的日韩av| 亚洲免费一区二区| 日韩视频在线免费| 久久精品欧美| 久久高清免费观看| 国产精品二区二区三区| 亚洲国产日韩欧美| 在线免费观看欧美| 久久丁香综合五月国产三级网站| 亚洲视频免费| 欧美精品久久一区| 91久久精品国产91久久| 亚洲国产美女久久久久| 久久精品官网| 欧美激情一区二区三区四区| 亚洲国产精品成人精品| 久热精品视频| 一色屋精品视频免费看| 欧美一级视频精品观看| 新狼窝色av性久久久久久| 国产精品户外野外| 亚洲欧美高清| 免费亚洲电影| 亚洲直播在线一区| 国产欧美日本| 久久久亚洲人| 亚洲美女在线视频| 久久av一区二区三区亚洲| 精品成人在线观看| 欧美精品国产精品日韩精品| 中文精品视频| 麻豆精品一区二区综合av| 亚洲精品少妇| 国语自产精品视频在线看抢先版结局| 久久久久在线| 亚洲午夜av在线| 欧美成人a视频| 午夜亚洲视频| 在线视频中文亚洲| 亚洲风情亚aⅴ在线发布| 国产精品久久二区| 欧美黄在线观看| 久久免费视频观看| 亚洲综合日韩| 一区二区日韩欧美| 亚洲激情在线| 欧美激情国产高清| 久久综合九色综合网站 | 伊人久久噜噜噜躁狠狠躁| 欧美jizzhd精品欧美巨大免费| 午夜国产不卡在线观看视频|