2013-03-11 75 views
3

今天我第一次看到這種表演,我很好奇爲什麼這個作品。我認爲以這種方式進行投球將分配給臨時隊員,而不是隊員。使用VC2010。爲什麼左值演員工作?

class A 
{ 
public: 

    A() : 
     m_value(1.f) 
    { 
     ((float)m_value) = 10.f; 
    } 

    const float m_value; 
}; 
+2

那是確切的片斷,你試過嗎?通常這應該是錯誤的,因爲m_value沒有被初始化,不應該編譯賦值。 – PlasmaHH 2013-03-11 16:12:28

+0

http://liveworkspace.org/code/nVBzK$0,顯然它不起作用 – 2013-03-11 16:12:32

+3

**是不允許的,它應該出於多種原因出錯(包括「m_value」未被分配的事實在初始化列表中的值) – 2013-03-11 16:13:27

回答

3

它不應該工作。一個明確的類型轉換到float採用鑄造符號將是一個prvalue(第5.4節):

表達(T)鑄表達的結果是T類型。如果T是左值引用類型或對函數類型的右值引用,則結果是左值;如果T是對對象類型的右值引用,則結果爲左值; 否則結果是一個價值

我的重點增加了。

賦值運算符需要一個左值作爲其左操作數(§5.17):

所有需要修改的左值作爲其左操作數,並返回一個左值指的是左操作數。

一個價值不是一個左值。

2

即使在修復所有其他問題以使代碼編譯之後,它也只能在VC2010中運行,因爲它使用非標準擴展。而如果指定/Wall看到所有警告,編譯器會發出

警告C4213:使用非標準擴展:投上L值