我今天第一次看到这种演员阵容,我很好奇为什么会这样。我认为以这种方式铸造会分配给临时成员,而不是班级成员。使用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;
};
即使在修复了所有其他问题以使代码编译之后,它也只能在 VC2010 中工作,因为它使用了非标准扩展。如果您指定/Wall
查看所有警告,您的编译器将发出
警告 C4213:使用了非标准扩展:在左值上强制转换
它不应该工作。显式类型转换为float
使用强制转换表示法将是纯右值(第 5.4 节):
表达式
(T)
cast-expression的结果是 类型T
。如果 T 是左值引用类型或对函数类型的右值引用,则结果是左值;如果 T 是对对象类型的右值引用,则结果是 xvalue;否则结果是纯右值。
我的重点补充说。
赋值运算符需要一个左值作为其左操作数(第 5.17 节):
所有这些都需要一个可修改的左值作为它们的左操作数,并返回一个指向左操作数的左值。
prvalue 不是左值。