2010-11-10 41 views
6

我在看下面的表格代碼:值初始化一個const成員的引用

class foo 
{ 
    public: 
    foo() {} 

    //... 
}; 

class bar 
{ 
    public: 
    bar() : ref() {} 

    private: 
    const foo &ref; 
}; 

正在初始化以這種方式使用的臨時正確的參考?我知道可以使用臨時變量初始化一個局部變量的const引用,並且這樣做延長了臨時變量的生存期,

const foo &tmp = funcThatReturnsByValue(); //OK 

然而,答案相關的initialize reference in initialization list之一表明,有「短命」和「長壽命」的引用,而如上初始化ref是不確定的行爲(即使ref之間的差異是const參考)。

標準中的12.2.5部分說「在構造函數的ctor-initializer中引用成員的臨時綁定一直存在,直到構造函數退出」。這是描述這種情況嗎?

+0

你能修復你的代碼,以便它實際上涉及臨時? – 2010-11-10 19:34:09

+0

ref()不會將ref綁定到foo的臨時實例?對不起,如果我的術語不準確......我正在盡我所能去理解這段代碼片段。 – user168715 2010-11-10 19:42:21

+0

也許這個評論是毫無價值的(我不知道你在看這段代碼的上下文),但是如果'ref'是一個指針,問題就會消失。關鍵是引用不能被初始化,但指針可以(它們被初始化爲零)。而且,大多數編譯器(至少MSVC)都會發出警告,無法生成默認賦值運算符。作爲一個指導原則,無論何時你想要一個引用成員,你實際上需要一個指針...... – 2010-11-10 21:03:01

回答

4

此代碼格式不正確。您不能默認初始化或初始化引用。

如果你實際上有一個表達式ref(),那麼是的,12.2.5將被應用,並且當構造函數退出時臨時的將被銷燬。

+1

你會想,但我不能讓GCC 4.3.4來實際做到這一點。 – 2010-11-10 19:47:51

1

我猜你想要做的是:

bar() : ref(foo()) {} 

但不要天真地認爲,一個臨時的壽命延長,直到有一個對它的引用。不,實際上不是。因此,無論是否爲const,您都可以使用普通對象初始化引用。

2

你的例子不是創建一個臨時 - 要做到這一點,你需要改變:

bar() : ref(foo()) {} 

現在你結合的參照暫時的,臨時對象將在年底被銷燬的構造函數。你的參考將是無效的,這不是一件好事。