为啥左值转换有效?

Posted

技术标签:

【中文标题】为啥左值转换有效?【英文标题】:Why does an lvalue cast work?为什么左值转换有效? 【发布时间】:2013-03-11 16:09:19 【问题描述】:

我今天第一次看到这种演员阵容,我很好奇为什么会这样。我认为以这种方式铸造会分配给临时成员,而不是班级成员。使用VC2010。

class A

public:

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

   const float m_value;
;

【问题讨论】:

那是您尝试的确切 sn-p 吗?通常这应该会出错,因为 m_value 没有初始化并且不应该编译赋值。 liveworkspace.org/code/nVBzK$0,显然不行 是不允许的,它应该由于多种原因而出错(包括m_value在初始化列表中没有被赋值) 在你提问之前,你不需要在A的构造函数中初始化那个m_value吗? 我编辑成我实际使用的。它仍然分配它。很高兴知道我的怀疑是正确的。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

它不应该工作。使用强制转换表示法到 float 的显式类型转换将是纯右值(第 5.4 节):

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

我的重点补充了。

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

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

prvalue 不是左值。

【讨论】:

以上是关于为啥左值转换有效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥非 const 引用必须用左值初始化?

为啥 constexpr 隐式转换并不总是有效?

将文字转换为左值

应用间接时,标准是不是要求指针变量的左值到右值转换?

避免左值转换警告和错误的批准方法?

无序映射的左值到右值转换