我今天看到这种铸造的第一次,我很好奇,为什么这个工程。 我想以这种方式铸造将会分配给暂时的,而不是类成员。 利用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;
};
它不应该工作。 一个明确的类型转换到float
采用铸造符号将是一个prvalue(第5.4节):
该表达式的结果
(T)
铸表达型的T
。 结果是左值如果T是一个左值引用类型或右值引用的功能类型和x值如果T是一个rvalue参照到对象类型; 否则结果是prvalue。
我加着重号。
赋值运算符需要一个左值作为其左操作数(§5.17):
所有这些都需要修改的左值作为其左操作数,并返回一个左值指的是左操作数。
一个prvalue不是左值。
即使修复所有其他问题,使代码编译后,它只是因为它使用了非标准扩展工作在VC2010。 而如果指定/Wall
看到所有警告,编译器会发出
警告C4213:非标准扩展使用:投上L值