2013-02-13 21 views
0

我得到一個錯誤在下面的代碼段地址錯誤 - ç採取的臨時

void setStyle(const ctlStyleBase* style) 
{ 
    //do something 
} 

void create(const ctlStyleBase* style = 0) 
{ 
     if(style == 0) setStyle(&ctlStyleGradient()); // error : taking address of temporary 
     else setStyle(style); 
} 

我不認爲這是錯誤的,因爲我只在使用setStyle使用它,它贏得了」 t在setStyle返回之前被破壞。 有人能告訴我代碼是否有問題?

[編譯克++ 4.7.2]

+0

傳遞const引用以避免錯誤:'const const ctlStyleBase&style' – 2013-02-13 10:02:40

+1

它有一個臨時地址的問題(它不比'&(5 + 7)'更有效) - 你是否期望它也能工作?) – 2013-02-13 10:02:42

+1

使用參考,看起來像'ctlStyleGradient()'的價值回報,並可以綁定是臨時的* const引用*,那麼改變你的簽名,以'無效的setStyle(常量ctlStyleBase和風格)'與'的setStyle調用(ctlStyleGradient());' – Nim 2013-02-13 10:03:04

回答

0

的問題是,你根本無法採取一個右值表達式的地址。您的ctlStyleGradient按值返回ctlStyleBase,將其複製出該函數。這給你一個臨時值,而ctlStyleGradient()是一個右值表達式。你不能在這個表達式上做&

如果您不需要修改您傳遞給setStyle的對象,那麼你可以改變它採取const參考:

void setStyle(const ctlStyleBase& style) 
{ 
    //do something 
} 

if(style == 0) setStyle(ctlStyleGradient()); 

如果確實需要修改它,然後你就會必須採取ctlStyleBase對象的本地副本,並通過由值或引用:

void setStyle(ctlStyleBase style) 
{ 
    //do something 
} 


if(style == 0) { 
    ctlStyleBase styleCopy = ctlStyleGradient(); 
    setStyle(styleCopy); 
} 
0

你可以這樣做:

void create(const ctlStyleBase* style = 0) 
{ 
     if(style == 0) 
     { 
      ctlStyleGradient temp; 
      setStyle(&temp); 
     } 
     else setStyle(style); 
} 

但是,老實說,我會重做你的代碼,所以你不這樣做,傳遞指針到局部變量,這是冒險的業務。也許改變setStyle調用,以便它檢查空指針?

+0

是的,它確實是解決這個問題的一種方法,但似乎是代碼不好看 – 2013-02-13 10:18:10

2

好,堅韌 - 那就是你不能把一個臨時對象的地址語言的規則。規則的原因是,基本上從來沒有一個好的原因來做到這一點。

在你的榜樣,ctlStyleGradient()返回ctlStyleBase類型的一些對象。如果你想修改setStyle函數中的那個對象(儘管你不這樣做),那麼只要你完成了,對象就不復存在,從而使整個修改變得毫無意義。

是的,你能湊合代碼,其中的操作具有可觀察到的副作用,但其本身是風格非常差。所以,沒有深層的技術理由說明爲什麼你不應該能夠接受臨時的地址,但是語言決定不讓你這樣做,因爲它被認爲是不適當的。

但這似乎並不是你想要做的。也許你的意思是爲ctlStyleGradient()返回一個指針本身?或者,如果您只需要觀察一個狀態並永不改變它,請通過值或const引用傳遞狀態。

+0

setStyle函數可能不會修改任何東西(它需要一個const *) – 2013-02-13 10:07:41

+0

@ R.MartinhoFernandes:好點,已更新。 – 2013-02-13 10:10:02