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

隨筆-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>
            久久久xxx| 欧美黑人在线观看| 国产一区二区三区网站| 性色av一区二区三区| 一本综合久久| 亚洲九九九在线观看| 国产精品h在线观看| 欧美亚洲综合网| 欧美在线一级视频| 亚洲国产岛国毛片在线| 最近中文字幕mv在线一区二区三区四区| 久久婷婷av| 亚洲伦伦在线| 亚洲免费在线播放| 亚洲丰满在线| 亚洲看片一区| 国产视频一区二区在线观看| 美女网站久久| 欧美肉体xxxx裸体137大胆| 欧美一区二区精美| 免费精品99久久国产综合精品| 艳女tv在线观看国产一区| 亚洲男女自偷自拍| 91久久久久久久久| 亚洲欧美春色| 夜夜嗨av一区二区三区四季av| 亚洲色图制服丝袜| **网站欧美大片在线观看| 一本色道久久综合狠狠躁篇怎么玩| 国产精品人人做人人爽| 欧美大片一区| 国产伦精品一区二区三区视频黑人| 老司机精品导航| 国产精品videosex极品| 欧美二区在线| 国产精品亚洲综合天堂夜夜| 欧美激情第六页| 国产性天天综合网| av成人免费| 亚洲激情av| 久久精品国产免费| 亚洲综合色丁香婷婷六月图片| 久久人人爽人人爽| 欧美一区二视频在线免费观看| 欧美成人激情视频| 久久资源av| 国产欧美日韩综合| 亚洲无限av看| 99精品视频一区二区三区| 久久精品一区二区三区中文字幕| 亚洲欧美影院| 欧美三级中文字幕在线观看| 欧美国产日韩一区| 一区三区视频| 亚洲欧美在线另类| 午夜日韩电影| 国产精品二区二区三区| 亚洲看片免费| 一二美女精品欧洲| 欧美日本网站| 亚洲精品国产品国语在线app | 在线视频欧美精品| av成人免费观看| 欧美精品免费看| 亚洲国产欧美日韩| 亚洲精品三级| 欧美大尺度在线观看| 欧美国产日韩免费| 亚洲精品国产欧美| 欧美激情精品久久久久| 亚洲盗摄视频| 日韩一级在线观看| 欧美精品久久久久久| 亚洲精品日韩激情在线电影| 99日韩精品| 国产精品jizz在线观看美国 | 亚洲欧美激情一区二区| 亚洲欧美日韩国产中文在线| 欧美午夜欧美| 午夜在线观看欧美| 久久综合中文| 亚洲国产精品久久久| 欧美激情国产日韩| 99视频热这里只有精品免费| 亚洲一区二区三区免费观看 | 欧美大片一区| 亚洲精品美女在线| 午夜精品久久久久久99热软件| 国产欧美一区视频| 久久青青草综合| 亚洲六月丁香色婷婷综合久久| 亚洲欧美另类久久久精品2019| 国产欧美日韩不卡| 免费国产自线拍一欧美视频| 亚洲欧洲日产国产综合网| 亚洲欧美日韩网| 狠狠操狠狠色综合网| 欧美风情在线观看| 亚洲一区在线播放| 欧美xx视频| 亚洲综合视频1区| 在线观看三级视频欧美| 欧美日韩国产在线播放网站| 亚洲欧美日韩网| 欧美国产日韩亚洲一区| 先锋影音久久久| 亚洲国产精品一区二区三区| 欧美日韩日韩| 久久一区激情| 亚洲综合视频网| 亚洲黄色大片| 久久婷婷av| 午夜在线一区| 99av国产精品欲麻豆| 国语精品一区| 国产精品yjizz| 欧美r片在线| 久久国产精品亚洲77777| 99精品久久久| 亚洲国产成人av在线| 久久精品国产视频| 亚洲午夜未删减在线观看| 1024日韩| 韩国在线视频一区| 国产精品色在线| 欧美日韩午夜激情| 欧美成人免费大片| 欧美综合激情网| 亚洲欧美日韩一区二区三区在线| 亚洲激情视频| 欧美激情久久久| 美女视频黄免费的久久| 久久国产一区二区三区| 亚洲一区二区三区四区五区午夜| 最新国产成人在线观看 | 欧美高清在线| 久久综合电影| 久久久一区二区| 欧美中文字幕精品| 欧美一区2区视频在线观看| 亚洲网站视频福利| 亚洲午夜小视频| 亚洲视频中文| 亚洲一区二区免费看| 99国产精品久久久久老师| 亚洲日韩欧美视频| 亚洲免费不卡| 中日韩男男gay无套| 一区二区三区日韩欧美| 一区二区欧美在线| 亚洲视频你懂的| 亚洲砖区区免费| 午夜免费在线观看精品视频| 午夜欧美精品| 久久精品视频在线看| 久久精品国产一区二区电影| 久久久久中文| 欧美xx视频| 欧美日韩在线不卡| 国产精品久久久久久亚洲调教| 国产精品高精视频免费| 国产精品网站在线| 黄色一区二区在线| 亚洲福利专区| 一区二区三区欧美视频| 亚洲欧美另类中文字幕| 欧美在线观看网址综合| 久久婷婷国产综合精品青草| 亚洲第一二三四五区| 亚洲精品欧美激情| 亚洲砖区区免费| 久久久综合网| 欧美日韩亚洲综合| 国产综合色在线视频区| 亚洲国产日韩精品| 亚洲一区二区动漫| 久久久久9999亚洲精品| 亚洲电影观看| 亚洲一区二区三区精品在线观看| 久久国产精品久久久久久久久久 | 免费久久精品视频| 欧美日韩亚洲一区二区三区| 国产麻豆综合| 亚洲人成7777| 久久成年人视频| 欧美国产第二页| 亚洲性av在线| 欧美大片免费| 国产一区二区三区四区五区美女 | 国产精品日韩欧美一区二区三区| 黑人一区二区三区四区五区| 一区二区三区产品免费精品久久75 | 亚洲视频免费| 亚洲国产欧美不卡在线观看| 亚洲综合清纯丝袜自拍| 亚洲国产精品精华液网站| 亚洲永久免费av| 欧美日韩免费一区| 亚洲三级免费| 老牛嫩草一区二区三区日本|