lvalue, которое вы используете для доступа к сохраненному значению y
, не *reinterpret_cast<Foo*>(&y)
, типа Foo
, но reinterpret_cast<Foo*>(&y)->x
, который имеет тип float
.Доступ к float
с использованием lvalue типа float
- это нормально.В C ++ вы не можете «получить доступ к значению объединения или структуры» (как целое), вы можете получить доступ только к отдельным членам.Обоснование, которое вы цитировали, указывает на разницу между C и C ++:
struct X { int a, b; };
struct X v1 = {1, 2}, v2;
v2 = v1;
В стандарте C в стандарте говорится, что присвоение загружает значение v1
(как целое), чтобы присвоить его v2
.Здесь к значениям объектов v1.a
и v2.b
(оба имеют типы int
) обращаются с использованием lvalue типа struct X
(который не int
).
В C ++ стандарт говорит, что присваивание вызывает сгенерированный компилятором оператор присваивания, который эквивалентен
struct X {
...
struct X& operator=(const struct X&other)
{
a = other.a;
b = other.b;
}
};
В этом случае вызов , оператор присваивания не имеет доступа к какому-либо значению,потому что RHS передается по ссылке.И выполнение оператора присваивания получает доступ к двум полям int
по отдельности (что нормально, даже без правила агрегирования), так что это снова не позволяет получить доступ к значению через lvalue типа struct X
.