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

隨筆-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>
            午夜国产欧美理论在线播放| 亚洲欧美日韩一区二区| 久久午夜精品| 欧美影院一区| 黄色av成人| 免费亚洲网站| 欧美国产精品v| 亚洲一区二区三区四区五区午夜 | 狠狠色噜噜狠狠色综合久| 久久国产精彩视频| 久久精品二区三区| 日韩亚洲欧美中文三级| 999亚洲国产精| 国产日韩欧美一二三区| 久久综合九色欧美综合狠狠| 免费中文日韩| 亚洲伊人观看| 久久国产日本精品| 一级成人国产| 欧美在线亚洲在线| 亚洲精品综合| 午夜欧美大尺度福利影院在线看 | 久久国产毛片| 99国产精品国产精品久久 | 久色婷婷小香蕉久久| 美女精品在线| 亚洲欧美电影在线观看| 久久精品水蜜桃av综合天堂| 亚洲精品人人| 亚洲综合日本| 99精品欧美一区| 欧美亚洲视频| 亚洲图片在线观看| 久久久国产精品一区二区三区| 99视频超级精品| 久久久久久久一区二区三区| 一区二区三区视频在线播放| 欧美专区中文字幕| 一区二区三区精品视频| 久久成人一区二区| 亚洲一区二区三| 欧美成人伊人久久综合网| 亚洲欧美成aⅴ人在线观看| 麻豆成人在线观看| 久久久久久久一区| 国产精品久久久久久五月尺| 欧美国产综合视频| 国内自拍一区| 午夜免费日韩视频| 午夜免费久久久久| 欧美日本在线视频| 欧美激情在线播放| 激情丁香综合| 久久国产精品久久w女人spa| 亚洲自啪免费| 欧美午夜精品久久久久久孕妇 | 亚洲国产日韩欧美在线99| 午夜久久久久久久久久一区二区| 一区二区欧美亚洲| 欧美国产第一页| 欧美成熟视频| 亚洲电影天堂av| 久久婷婷国产综合精品青草| 久久九九电影| 伊人久久亚洲影院| 久久久精品2019中文字幕神马| 欧美综合第一页| 国产一区二区三区在线播放免费观看| 亚洲一区3d动漫同人无遮挡| 一本大道久久a久久精品综合| 欧美成人免费播放| 亚洲国产人成综合网站| 亚洲国产老妈| 欧美韩日一区二区三区| 亚洲激情二区| 夜夜狂射影院欧美极品| 欧美日韩国产天堂| 一区二区三区视频免费在线观看| 一区二区日本视频| 国产精品av一区二区| 99精品国产99久久久久久福利| 99视频精品全国免费| 欧美视频福利| 亚洲欧美日韩精品久久亚洲区| 亚洲欧美三级在线| 国内精品久久久久影院色| 久久精品亚洲热| 亚洲国产激情| 亚洲一区二区三区久久| 国产欧美三级| 久久婷婷丁香| 99精品国产在热久久婷婷| 亚洲性视频网址| 国产一区二区三区四区五区美女| 久久精品99国产精品| 亚洲电影一级黄| 亚洲欧美日韩精品在线| 黄色成人在线| 欧美人与性动交a欧美精品| 亚洲视频一二三| 狂野欧美激情性xxxx| 日韩视频免费观看| 国产亚洲福利| 欧美精品一区二区在线播放| 国产精品99久久久久久人| 久热爱精品视频线路一| 亚洲精品在线视频| 国产老肥熟一区二区三区| 久久免费一区| 亚洲一区二区四区| 欧美激情第4页| 欧美中文字幕久久| 一区二区三区精品| 影音先锋国产精品| 欧美日韩在线播放一区| 久久精品中文字幕一区二区三区| 99国产精品久久| 亚洲电影成人| 久久久伊人欧美| 亚洲欧洲99久久| 亚洲人久久久| 亚洲电影下载| 好吊色欧美一区二区三区视频| 欧美日韩亚洲一区三区| 久久综合网络一区二区| 亚洲欧美日韩精品久久亚洲区| 亚洲黄一区二区| 欧美高清视频一二三区| 欧美在线视频免费| 亚洲一区二区三区乱码aⅴ| 亚洲精品欧美专区| 亚洲韩国日本中文字幕| 狠狠色丁香久久婷婷综合丁香 | 欧美在线影院| 亚洲免费在线看| 亚洲天堂成人在线观看| 亚洲黄色影院| 欧美激情一区二区三区不卡| 久久精品国产2020观看福利| 亚洲在线一区| 亚洲一区二区三区成人在线视频精品| 亚洲人www| 亚洲三级观看| 亚洲日本免费| 亚洲精品综合| 99综合电影在线视频| 亚洲美女啪啪| 一区二区欧美日韩视频| 一区二区高清| 亚洲一区三区视频在线观看| 国产精品99久久99久久久二8| 一区二区日韩伦理片| 中文国产成人精品| 亚洲综合视频1区| 性久久久久久久| 性欧美xxxx视频在线观看| 欧美亚洲色图校园春色| 久久精品日韩一区二区三区| 久久裸体艺术| 亚洲国产mv| 99这里只有久久精品视频| 亚洲视频免费| 欧美在线亚洲一区| 欧美成人黄色小视频| 欧美区日韩区| 国产日产精品一区二区三区四区的观看方式 | 麻豆久久精品| 亚洲国产精品第一区二区| 亚洲国产综合在线看不卡| 亚洲黄色视屏| 亚洲欧美日韩国产| 久久婷婷综合激情| 欧美人成在线视频| 国产啪精品视频| 亚洲黄色片网站| 亚洲自拍偷拍色片视频| 久久尤物视频| 一本到12不卡视频在线dvd| 亚洲一区二区精品视频| 久久精品国产v日韩v亚洲| 欧美电影免费观看高清| 国产精品一区二区黑丝| 亚洲电影av在线| 午夜精品久久久久久久久久久| 久久视频在线视频| 亚洲美女黄色| 久久久综合激的五月天| 欧美日韩在线播放| 在线免费观看视频一区| 亚洲一级影院| 欧美韩国一区| 欧美一区二区三区啪啪| 欧美激情视频在线播放| 国产亚洲视频在线| 亚洲一区二区日本| 亚洲国产激情| 久久躁狠狠躁夜夜爽| 国产日本亚洲高清| 亚洲一区二区三区免费视频| 免费欧美日韩|