2014-02-05 108 views
0

我想不通使用下面的代碼的時候,爲什麼我總是收到編譯錯誤。臨時對象和非const引用

簡單的結構和它的init助手功能:

typedef struct _ccColor4F 
{ 
    GLfloat r; 
    GLfloat g; 
    GLfloat b; 
    GLfloat a; 
} ccColor4F; 

static inline ccColor4F ccc4f(const GLfloat r, const GLfloat g, const GLfloat b, const GLfloat a) 
{ 
    ccColor4F c4 = {r, g, b, a}; 
    return c4; 
} 

,並使用該結構的方法:

void TexturePolygon::setColor(ccColor4F &color); 

現在,如果我嘗試使用init功能如下我得到一個編譯錯誤。

poly->setColor(ccc4f(1.f, 1.f, 1.f, 1.f)); 

非const左值參考輸入 'ccColor4F'(又名 '的cocos2d :: _ ccColor4F')不能結合到臨時類型的 'ccColor4F'

我必須改變參數將setColor設置爲「常量引用」以避免錯誤。我明白一個臨時對象必須綁定到一個const引用。但在這種情況下,它是一個內聯函數,所以不應該有任何臨時對象。我錯過了什麼嗎?

謝謝。洛朗

+2

我不確定你爲什麼認爲'inline'會在這裏有所作爲。 –

+2

'inline'允許您在多個翻譯單元中定義該功能(對於許多編譯器來說,這對於內聯調用是必要的)。它不強制調用內聯,或者改變它的任何語義。即使優化了參考參數,仍然將其視爲參考。 –

+0

@FredLarson我以爲'inline'會改變調用的語義。 –

回答

3

功能是inline對天氣無軸承與否的對象是臨時的。

inline沒有做什麼,你認爲它。它甚至不做許多人認爲它所做的事情。

inline所做的就是讓功能可以在多個翻譯單元中定義。什麼inline不是 do是使內聯代碼擴展(這是一個提示,而不是一個要求,編譯器可以並且會忽略你),它不會影響調用的語義,參數或回報。

在您的代碼:

poly->setColor(ccc4f(1.f, 1.f, 1.f, 1.f)); 

通過ccc4f(1.f, 1.f, 1.f, 1.f)構造的目的是臨時。 setColor()inline的事實沒有區別。

如果您需要發送一個非暫時性的,以setColor(),那麼你必須建立一個非暫時性的ccc4f

ccc4f myObj(1.f, 1.f, 1.f, 1.f); 
poly->setColor (myObj); 

你可以範圍這讓myObj被破壞你打電話setColor之後:

{ 
    ccc4f myObj(1.f, 1.f, 1.f, 1.f); 
    poly->setColor (myObj); 
} 

但這似乎是毫無意義的,因爲myObj似乎不是一個RAII對象。爲什麼不只有setColor接受const參考並完成它?

+0

好的。我現在明白了。我錯了,認爲內聯可能會改變調用的語義。 PS:我將改爲const引用。這只是我不明白爲什麼我不得不在這種情況下。謝謝! –

2

setColor函數期望獲得一個分配的內存引用,這意味着它應該能夠做到

color = NULL; 

如果願意。你的代碼不允許這樣做,因爲你正在給一個臨時對象。

有什麼理由嗎?無論是setColor功能改變color參數,在這種情況下,它沒有任何意義給它一個臨時對象;或setColor功能不改變color參數,在這種情況下,它應當作爲一個const-引用傳遞。

相關問題