C++ 为什么左值演员可以工作?

C++ 为什么左值演员可以工作?,c++,visual-studio-2010,casting,assign,lvalue,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; }; 它不应该起作用。使用强制转换符号将显式类型转换为float,即prvalue(§5.4): 表达式(T)强制转换表达式的结果是类型T。如果T是

我今天第一次看到这样的演员阵容,我很好奇为什么会这样。我想用这种方式选角会分配给临时演员,而不是班级成员。使用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是对对象类型的右值引用,则结果为xvalue否则结果为prvalue

我的重点补充说

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

它们都需要一个可修改的左值作为左操作数,并返回一个引用左操作数的左值


prvalue不是左值。

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

警告C4213:使用了非标准扩展:在l值上强制转换


这就是你试过的片段吗?通常,这应该会出错,因为m_值未初始化且不应编译赋值。显然,这不起作用,这是不允许的,并且在您提出问题之前,它应该会因多种原因出错(包括
m_值
未在初始化列表中赋值),你不需要在A的构造函数中初始化这个
m_值吗?我编辑成我实际使用的值。它仍然分配它。很高兴知道我的怀疑是正确的。