为什么左值演员有效?

时间:2013-03-11 16:09:19

标签: c++ visual-studio-2010 casting assign lvalue

我今天第一次看到这种演员表,我很好奇为什么会这样。我认为以这种方式进行投射会分配给临时成员,而不是成员。使用VC2010。

class A
{
public:

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

   const float m_value;
};

2 个答案:

答案 0 :(得分:3)

它应该不起作用。使用强制转换符号的float显式类型转换将是prvalue(第5.4节):

  

表达式(T) cast-expression 的结果是T类型。如果T是左值引用类型或对函数类型的右值引用,则结果为左值;如果T是对象类型的右值引用,则结果为xvalue; 否则结果是prvalue

我强调了。

赋值运算符需要左值作为左操作数(第5.7节):

  

所有都需要一个可修改的左值作为左操作数,并返回一个左值操作数的左值。

prvalue不是左值。

答案 1 :(得分:2)

即使在修复所有其他问题以使代码编译之后,它也仅适用于VC2010,因为它使用非标准扩展。如果指定/Wall以查看所有警告,则编译器将发出

  

警告C4213:使用非标准扩展名:施放于l值