-->

为什么一个左投的工作?(Why does an lvalue cast work?)

2019-07-21 08:13发布

我今天看到这种铸造的第一次,我很好奇,为什么这个工程。 我想以这种方式铸造将会分配给暂时的,而不是类成员。 利用VC2010。

class A
{
public:

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

   const float m_value;
};

Answer 1:

它不应该工作。 一个明确的类型转换到float采用铸造符号将是一个prvalue(第5.4节):

该表达式的结果(T) 铸表达型的T 。 结果是左值如果T是一个左值引用类型或右值引用的功能类型和x值如果T是一个rvalue参照到对象类型; 否则结果是prvalue。

我加着重号。

赋值运算符需要一个左值作为其左操作数(§5.17):

所有这些都需要修改的左值作为其左操作数,并返回一个左值指的是左操作数。

一个prvalue不是左值。



Answer 2:

即使修复所有其他问题,使代码编译后,它只是因为它使用了非标准扩展工作在VC2010。 而如果指定/Wall看到所有警告,编译器会发出

警告C4213:非标准扩展使用:投上L值



文章来源: Why does an lvalue cast work?