Почему работает lvalue?

Сегодня я впервые увидел такой актерский состав, и мне любопытно, почему это работает. Я думал, что кастинг таким образом назначит временного, а не ученика. Использование VC2010.

class A
{
public:

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

const float m_value;
};

3

Решение

Это не должно работать. Явное преобразование типов в float с обозначением броска будет prvalue (§5.4):

Результат выражения (T) монолитно-выражение имеет тип T, Результатом является lvalue, если T является ссылочным типом lvalue или ссылкой rvalue на тип функции, и xvalue, если T является ссылкой rvalue на тип объекта; в противном случае результат является prvalue.

Мой акцент добавлен.

Оператор присваивания требует lvalue в качестве своего левого операнда (§5.17):

Все они требуют изменяемого lvalue в качестве своего левого операнда и возвращают lvalue, ссылаясь на левый операнд.

Prvalue не является lvalue.

3

Другие решения

Даже после устранения всех других проблем, связанных с компиляцией кода, он работает только в VC2010, поскольку использует нестандартное расширение. И если вы укажете /Wall чтобы увидеть все предупреждения, ваш компилятор выдаст

предупреждение C4213: используется нестандартное расширение: приведено значение l

2

По вопросам рекламы [email protected]