2011-01-27 19 views
20

考慮下面的代碼示例:將引用綁定到C++中尚未構造的對象是否安全?

class Base { 
public: 
    Base(string& _object) : object(_object) {} 
private: 
    string& object; 
}; 

class Derived: public Base { 
public: 
    Derived() : Base(object) {} 
private: 
    string object; 
}; 

顯然第一Base被構造和它被傳遞給一個尚未構造對象的引用。

內存分配給整個Derived對象,所以Derived::object是在合法可訪問的內存中,只是它的構造函數沒有運行。 Base::Base()不調用傳遞對象的任何方法,只存儲引用。它適用於Visual C++ 9.

根據C++標準它是安全的嗎?

+0

好問題。我已經在我的一個項目中完成了這項工作,並且工作正常。從未見過任何問題。但我想知道它是否「安全」。 – Nawaz 2011-01-27 11:31:54

回答

19

只要您在構建對象之前不「使用」引用,它就是安全的。您可以使用base-from-member idiom移動對象到基地之前,其自帶一個(私人)的基類,因此基地之前建造,如果你需要更改施工順序:

struct Base { 
    Base(string &ref) { 
    cout << "imagine the ctor uses the ref: " << ref; 
    } 
}; 

struct DerivedDetail { 
    DerivedDetail(string const &x) : object (x) {} 
    string object; 
}; 

struct Derived : private DerivedDetail, Base { 
    Derived() : DerivedDetail("foobar"), Base(object) {} 
    // In particular, note you can still use this->object and just 
    // ignore that it is from a base, yet this->object is still private 
    // within Derived. 
}; 

C++ 03 §3.8p6:

...前一個對象的生命週期已經開始,但是對象將佔用已分配或對象的生命週期結束後和存儲後的存儲其佔用的對象是前重用或釋放,可以使用引用原始對象的任何左值,但僅限於有限的方式。這樣的左值是指分配的存儲(3.7.3.2),並且使用不依賴於其值的 的左值的屬性是明確的。 ...

簡而言之:不要訪問任何成員,方法或將它傳遞給任何可以做到的事情。你可以把它的地址和綁定引用給它。

+0

+1爲標準報價! – Nawaz 2011-01-27 11:43:29

相關問題