Сегодня я впервые увидел такой актерский состав, и мне любопытно, почему это работает. Я думал, что кастинг таким образом назначит временного, а не ученика. Использование VC2010.
class A
{
public:
A() :
m_value(1.f)
{
((float)m_value) = 10.f;
}
const float m_value;
};
Это не должно работать. Явное преобразование типов в float
с обозначением броска будет prvalue (§5.4):
Результат выражения
(T)
монолитно-выражение имеет типT
, Результатом является lvalue, если T является ссылочным типом lvalue или ссылкой rvalue на тип функции, и xvalue, если T является ссылкой rvalue на тип объекта; в противном случае результат является prvalue.
Мой акцент добавлен.
Оператор присваивания требует lvalue в качестве своего левого операнда (§5.17):
Все они требуют изменяемого lvalue в качестве своего левого операнда и возвращают lvalue, ссылаясь на левый операнд.
Prvalue не является lvalue.
Даже после устранения всех других проблем, связанных с компиляцией кода, он работает только в VC2010, поскольку использует нестандартное расширение. И если вы укажете /Wall
чтобы увидеть все предупреждения, ваш компилятор выдаст
предупреждение C4213: используется нестандартное расширение: приведено значение l