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

隨筆-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>
            亚洲精品美女久久7777777| 一区二区三区黄色| 美女国产一区| 亚洲国产精品欧美一二99| 欧美成人情趣视频| 欧美激情视频免费观看| 一区二区激情视频| 制服丝袜亚洲播放| 国产日韩欧美一区在线| 毛片av中文字幕一区二区| 久久精品国产免费看久久精品| 亚洲综合成人在线| 在线看片成人| 亚洲伦理网站| 国产一区二区日韩| 亚洲国产成人av好男人在线观看| 欧美激情1区| 午夜精品久久| 欧美.www| 亚洲欧美中文日韩在线| 久久精品一区二区三区中文字幕| 91久久极品少妇xxxxⅹ软件| 日韩一二三区视频| 樱桃国产成人精品视频| 999在线观看精品免费不卡网站| 国产精品女主播| 欧美成人午夜免费视在线看片| 欧美三区不卡| 欧美高清视频一区| 国产伦精品一区二区三区视频黑人 | 国产亚洲欧洲一区高清在线观看 | 一区二区三区日韩精品视频| 午夜精品视频一区| 亚洲久久成人| 久久免费偷拍视频| 欧美一区二区三区免费大片| 农村妇女精品| 久久蜜桃精品| 国产九色精品成人porny| 亚洲激情一区| 亚洲高清不卡av| 午夜一区在线| 午夜精品免费| 欧美日韩亚洲一区二区三区四区| 久久午夜精品一区二区| 国产精品推荐精品| 亚洲美女中文字幕| 亚洲精品日韩一| 卡一卡二国产精品| 久久综合国产精品| 国产一区成人| 亚洲一区二区免费视频| 国产精品视频久久| 最近中文字幕日韩精品| 亚洲国产二区| 麻豆精品精品国产自在97香蕉| 久久久久高清| 国产九色精品成人porny| 亚洲啪啪91| 亚洲精品在线观看免费| 牛夜精品久久久久久久99黑人| 麻豆成人91精品二区三区| 国产综合久久久久久| 欧美一区二区在线免费观看| 久久av一区| 国产日韩欧美在线播放| 亚洲欧美卡通另类91av| 性视频1819p久久| 国产精自产拍久久久久久| 午夜久久久久久| 久久夜色精品国产噜噜av| 激情成人av在线| 麻豆精品网站| 亚洲伦理在线免费看| 亚洲一区二区在线免费观看视频| 欧美三日本三级少妇三2023| 在线亚洲+欧美+日本专区| 午夜伦理片一区| 国产一区二区三区视频在线观看 | 久久蜜桃香蕉精品一区二区三区| 久久人人97超碰国产公开结果| 国产一区二区三区四区五区美女| 久久精品2019中文字幕| 欧美激情一区三区| 亚洲一本视频| 国产一区二区三区观看| 久热精品在线| 一区二区三区视频观看| 久久精品国产2020观看福利| 一区二区在线看| 欧美激情综合网| 午夜精品成人在线| 欧美成人有码| 亚洲一区激情| 极品裸体白嫩激情啪啪国产精品| 免费在线观看成人av| 日韩亚洲欧美中文三级| 久久久国产一区二区三区| 在线观看视频亚洲| 国产精品第三页| 久久夜色精品国产亚洲aⅴ | 欧美一区激情| 亚洲激情女人| 国产精品日韩在线观看| 久久婷婷人人澡人人喊人人爽| 亚洲日本欧美天堂| 久久精品中文字幕一区| 日韩一区二区福利| 国内精品一区二区| 欧美三级视频在线| 久久婷婷国产综合精品青草| 亚洲视频在线一区| 亚洲承认在线| 久久久一本精品99久久精品66| 99精品国产热久久91蜜凸| 国产一区二区av| 欧美日韩在线观看视频| 男女视频一区二区| 久久精品人人| 欧美一区二区福利在线| 亚洲午夜精品17c| 亚洲高清色综合| 久久综合中文字幕| 久久九九国产| 亚洲伊人色欲综合网| 亚洲国产精品久久久久秋霞不卡| 国产亚洲一区在线| 国产欧美精品在线播放| 欧美日韩一区在线| 欧美日韩一二区| 欧美激情在线有限公司| 欧美不卡视频| 欧美成年人视频网站| 美女视频一区免费观看| 久久裸体视频| 久久综合伊人77777麻豆| 久久九九国产精品| 久久精品日韩欧美| 欧美一区久久| 久久精品91久久香蕉加勒比| 性欧美精品高清| 午夜在线精品偷拍| 欧美一区二区精品久久911| 亚洲在线免费观看| 亚洲欧美国产精品va在线观看| 亚洲线精品一区二区三区八戒| 一本一本a久久| 亚洲视频日本| 午夜在线一区二区| 久久精品国内一区二区三区| 久久精品成人| 免费国产一区二区| 欧美精品在线网站| 欧美日韩综合另类| 国产美女一区二区| 一区二区视频免费完整版观看| 亚洲国产精品v| 一区二区三欧美| 亚洲在线观看视频| 久久久久久伊人| 欧美国产一区二区在线观看| 亚洲精品一区二区三区不| 99伊人成综合| 久久gogo国模裸体人体| 美女黄网久久| 国产精品s色| 黄色综合网站| 一区二区三区四区蜜桃| 久久av一区| 亚洲人成人一区二区在线观看| 9久re热视频在线精品| 午夜日韩在线观看| 免费观看亚洲视频大全| 国产精品久久久久久久久久三级| 国产日韩欧美不卡| 亚洲国产三级网| 欧美一级视频| 亚洲激情社区| 亚洲欧美日韩一区二区| 麻豆精品精华液| 国产伦精品一区二区| 亚洲国产美女久久久久| 西西人体一区二区| 亚洲国产成人久久综合| 新狼窝色av性久久久久久| 欧美精品一区二区三区四区| 国产精品网站一区| 日韩亚洲在线| 蜜桃av一区| 欧美一级在线播放| 欧美日韩中国免费专区在线看| 影音先锋久久资源网| 亚洲欧美在线一区二区| 亚洲高清不卡一区| 久久久精品一区| 国产精品中文在线| 亚洲性感激情| 亚洲国内自拍| 老司机午夜精品视频| 国语自产偷拍精品视频偷 |