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

隨筆-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>
            影音国产精品| 欧美在线一级va免费观看| 久久一区视频| 欧美综合77777色婷婷| 国内精品伊人久久久久av一坑| 久久xxxx| 亚洲高清资源综合久久精品| 久久精品中文字幕免费mv| 中文精品视频一区二区在线观看| 欧美日本精品在线| 一区二区日韩精品| 国产精品嫩草久久久久| 正在播放欧美一区| 99精品99| 欧美色另类天堂2015| 欧美视频一区二区三区在线观看 | 精品91久久久久| 欧美视频精品一区| 欧美日韩系列| 欧美成人免费全部| 亚洲视频综合| 久久电影一区| 亚洲综合精品自拍| 在线精品在线| 亚洲国产精选| 欧美激情精品久久久久久免费印度| 久久只精品国产| 欧美在线观看视频| 亚洲专区一区| 亚洲精品国产品国语在线app| 亚洲综合日韩| 亚洲精品裸体| 亚洲国产精品日韩| 久久亚洲综合| 欧美在线黄色| 欧美一级视频精品观看| 久久久久久久性| 亚洲国产欧美国产综合一区| 亚洲国产成人久久综合| 亚洲欧美综合精品久久成人| 亚洲乱码国产乱码精品精天堂 | 久久久久久久999| 欧美日本精品| 亚洲精品韩国| 久久精品国产欧美亚洲人人爽| 最近中文字幕mv在线一区二区三区四区| 亚洲免费影院| 国产精品久久久久9999| 亚洲第一成人在线| 亚洲欧美视频在线观看| 欧美午夜视频网站| 日韩午夜激情| 亚洲福利视频二区| 亚洲一区二区三区四区五区黄| 国产精品国产成人国产三级| 在线欧美一区| 久久精品国产99国产精品澳门| 在线亚洲电影| 欧美午夜精品| 亚洲线精品一区二区三区八戒| 亚洲国产高清视频| 欧美激情乱人伦| 亚洲精品一区二区三区婷婷月 | 亚洲深夜福利| 日韩视频免费在线| 国产精品草草| 欧美一级视频精品观看| 小嫩嫩精品导航| 狠狠入ady亚洲精品经典电影| 久久久夜夜夜| 麻豆91精品| 99精品国产在热久久下载| 亚洲精一区二区三区| 欧美午夜激情在线| 亚洲精品乱码久久久久久按摩观| 国产欧美亚洲精品| 久久精品水蜜桃av综合天堂| 亚洲欧美日韩综合aⅴ视频| 国产精品女同互慰在线看| 亚洲免费一区二区| 欧美一区永久视频免费观看| 激情欧美丁香| 亚洲激情在线| 国产精品久久久久久久久久妞妞| 欧美中文在线观看| 久久亚洲午夜电影| 一区二区三区欧美在线观看| 亚洲一区高清| 在线国产欧美| 一区二区三区四区精品| 国产精品一区二区你懂得| 久久青草欧美一区二区三区| 免费欧美在线视频| 亚洲欧美日韩第一区| 久久精品一本久久99精品| 亚洲国产成人av| 一本久道综合久久精品| 国产欧美一区二区白浆黑人| 模特精品在线| 一区二区三区高清在线| 欧美日韩系列| 久久er精品视频| 乱码第一页成人| 亚洲中字在线| 久久久中精品2020中文| 亚洲深夜福利视频| 久久人人97超碰精品888| 亚洲精品美女久久久久| 校园春色综合网| 一区二区三区四区国产精品| 久久激情五月激情| 亚洲在线中文字幕| 老巨人导航500精品| 性欧美xxxx视频在线观看| 免费不卡在线观看| 久久久精品久久久久| 欧美三日本三级三级在线播放| 午夜精品久久久久久久99黑人| 久久爱www久久做| 亚洲欧美春色| 日韩视频一区二区三区在线播放免费观看 | 国产精品日韩在线播放| 两个人的视频www国产精品| 国产精品video| 亚洲黄色成人| 伊人影院久久| 欧美伊人久久| 国产日韩欧美一区二区三区在线观看 | 一区二区三区视频在线观看| 亚洲一级网站| 黄色在线一区| 久久裸体视频| 欧美午夜精彩| 免费久久99精品国产自在现线| 欧美日韩国产三区| 久久久久久999| 国产精品日韩专区| 亚洲午夜国产一区99re久久 | 久久国产精品亚洲77777| 亚洲欧美国产精品专区久久| 欧美在线观看一二区| 极品尤物久久久av免费看| 在线视频欧美日韩| 一本色道久久加勒比88综合| 欧美成人黑人xx视频免费观看| 欧美成人午夜免费视在线看片 | 久久久久久久综合| 国产亚洲精品高潮| 亚洲免费一区二区| 久久福利电影| 精品1区2区3区4区| 蜜臀av国产精品久久久久| 亚洲国产精选| 亚洲视频1区| 国产精品国色综合久久| 亚洲一二三区精品| 香蕉免费一区二区三区在线观看 | 一区二区亚洲| 国产精品护士白丝一区av| 欧美成人国产| 国产精品久久综合| 久久九九热免费视频| 国产啪精品视频| 亚洲欧美怡红院| 在线观看日韩av电影| 玖玖玖国产精品| 性视频1819p久久| 久久九九全国免费精品观看| 国产亚洲一级| 亚洲欧美激情一区| 久久精品国产亚洲aⅴ| 欧美大片一区| 久久精品欧美| 欧美视频精品在线| 国产精品日日摸夜夜添夜夜av | 久久久噜噜噜久久| 欧美不卡视频| 亚洲高清毛片| 亚洲欧美日韩网| 亚洲永久免费精品| 欧美高清在线播放| 国产无遮挡一区二区三区毛片日本| 亚洲国内自拍| 久久成人精品视频| 一区二区三区精品视频在线观看| 久久久久久高潮国产精品视| 欧美精品久久久久久久| 欧美不卡一区| 久久精品日韩一区二区三区| 欧美国产精品久久| 99精品视频免费在线观看| 亚洲美女免费精品视频在线观看| 久久综合中文| 欧美人成网站| 欧美日韩一卡| 久久国产66| 午夜精品999| 亚洲精品1234| 久久一本综合频道| 小嫩嫩精品导航|