今天我第一次看到這種表演,我很好奇爲什麼這個作品。我認爲以這種方式進行投球將分配給臨時隊員,而不是隊員。使用VC2010。爲什麼左值演員工作?
class A
{
public:
A() :
m_value(1.f)
{
((float)m_value) = 10.f;
}
const float m_value;
};
今天我第一次看到這種表演,我很好奇爲什麼這個作品。我認爲以這種方式進行投球將分配給臨時隊員,而不是隊員。使用VC2010。爲什麼左值演員工作?
class A
{
public:
A() :
m_value(1.f)
{
((float)m_value) = 10.f;
}
const float m_value;
};
它不應該工作。一個明確的類型轉換到float
採用鑄造符號將是一個prvalue(第5.4節):
表達
(T)
鑄表達的結果是T
類型。如果T是左值引用類型或對函數類型的右值引用,則結果是左值;如果T是對對象類型的右值引用,則結果爲左值; 否則結果是一個價值。
我的重點增加了。
賦值運算符需要一個左值作爲其左操作數(§5.17):
所有需要修改的左值作爲其左操作數,並返回一個左值指的是左操作數。
一個價值不是一個左值。
即使在修復所有其他問題以使代碼編譯之後,它也只能在VC2010中運行,因爲它使用非標準擴展。而如果指定/Wall
看到所有警告,編譯器會發出
警告C4213:使用非標準擴展:投上L值
那是確切的片斷,你試過嗎?通常這應該是錯誤的,因爲m_value沒有被初始化,不應該編譯賦值。 – PlasmaHH 2013-03-11 16:12:28
http://liveworkspace.org/code/nVBzK$0,顯然它不起作用 – 2013-03-11 16:12:32
**是不允許的,它應該出於多種原因出錯(包括「m_value」未被分配的事實在初始化列表中的值) – 2013-03-11 16:13:27