2017-08-25 87 views
1

當運行上的gcc 8以下代碼(https://wandbox.org/,用 「克++ prog.cc -Wall -Wextra -std = C++ 1Z」):C++結合參考構件構造符參數

#include <iostream> 

class B{ 
public: 
    B(): copy(false){ std::cout << "B-constructed" << std::endl;} 
    B(const B& b): copy(true){ std::cout << "B-copy-constructed" << std::endl; } 
    ~B(){ std::cout << (copy?"B-destructed":"B-(copy)-destructed") << std::endl;} 

    bool copy; 
}; 

class A{ 
public: 
    A(B b): bref(b){std::cout << "A-constructed" << std::endl;} 
    ~A() {std::cout << "A-destructed" << std::endl;} 
    B &bref; 
}; 


void f(){ 
    B b; 
    A a(b); 

    std::cout << "f over" << std::endl; 
} 

int main() 
{ 
    f(); 

    std::cout << "main over" << std::endl; 
    return 0; 
} 

以下輸出得到:

B-constructed 
B-copy-constructed 
A-constructed 
B-destructed 
f over 
A-destructed 
B-(copy)-destructed 
main over 

對象破壞的順序看起來很不尋常。就好像構造函數參數的生命期被延長一樣。該標準是否說明綁定成員對構造函數參數的引用?

我不認爲從標準的這句話適用,因爲參數不是一個臨時對象(但我不知道「臨時表達式」的定義):

臨時表達綁定到mem初始化器中的引用成員是不合格的。 [實施例:

結構A {

A():V(42){} //錯誤

const int的& V;

};

末端示例]

+1

你混了在字符串'〜B':如果它是一個副本,說這通常破壞,如果沒有,說是複製破壞 –

+0

那麼什麼是問題呢?在修復之後,你認爲在施工/破壞順序方面有什麼錯誤? –

+0

現在訂單看起來不錯。然而,問題仍然是標準是否說明了綁定成員對構造函數參數的引用。 – user42768

回答

1

你的析構函數有一個邏輯上的錯誤,因爲你打印的時候copy是錯誤的一個副本被破壞。

更改此:

~B(){ std::cout << (copy?"B-destructed":"B-(copy)-destructed") << std::endl;} 

這樣:

~B(){ std::cout << (copy?"B-(copy)-destructed":"B-destructed") << std::endl;} 

現在輸出:

B-constructed 
B-copy-constructed 
A-constructed 
B-(copy)-destructed 
f over 
A-destructed 
B-destructed 
main over 

漂亮和清晰(Order of member constructor and destructor calls)。


該標準是否說明綁定成員對構造函數參數的引用的任何內容?

同樣,前一個對象的生命週期已經開始,但是對象將佔用已分配或將 壽命的對象已經結束之後和 存儲之後存儲其佔用的 對象是前重用或釋放,可以使用任何引用原始對象的glvalue,但只能以有限的方式使用。對於正在建設或銷燬的對象 ,請參見[class.cdtor]。否則,這樣的glvalue是指分配的存儲 ([basic.stc.dynamic.deallocation]),並且使用不依賴於其值的glvalue的屬性是明確定義的。

Source

+0

我對我的錯誤表示歉意。是的,現在訂單似乎是正確的。但是,該標準是否提及了有關綁定成員引用的構造函數參數? – user42768

+0

當然,沒問題。在看到您的答案之前,我通過@king_nak收到的評論更正了我的問題。 – user42768

+0

我發現這個:http://eel.is/c++draft/basic.life#7。我認爲它解釋了當引用一個生命週期結束的對象時會發生什麼。 – user42768