Si consideri la seguente struttura:La lettura di un membro di unione inattivo dello stesso tipo di uno attivo è ben definito?
struct vec4
{
union{float x; float r; float s};
union{float y; float g; float t};
union{float z; float b; float p};
union{float w; float a; float q};
};
Qualcosa di simile sembra essere usato per esempio in GLM a fornire tipi GLSL-come come vec4
, vec2
ecc ..
Ma anche se l'utilizzo previsto è come per rendere questo possibile
vec4 a(1,2,4,7);
a.x=7;
a.b=a.r;
, che sembra essere un comportamento indefinito, perché, come citato here ,
In un sindacato, al massimo uno dei membri di dati può essere attivo in qualsiasi momento, ovvero il valore di al massimo uno dei membri di dati può essere memorizzato in un'unione in qualsiasi momento.
Non sarebbe meglio ad es. usa solo definire la struttura qualcosa come la seguente?
struct vec4
{
float x,y,z,w;
float &r,&g,&b,&a;
float &s,&t,&p,&q;
vec4(float X,float Y,float Z,float W)
:x(X),y(Y),z(Z),w(W),
r(x),g(y),b(z),a(w),
s(x),t(y),p(z),q(w)
{}
vec4()
:r(x),g(y),b(z),a(w),
s(x),t(y),p(z),q(w)
{}
vec4(const vec4& rhs)
:x(rhs.x),y(rhs.y),z(rhs.z),w(rhs.w),
r(x),g(y),b(z),a(w),
s(x),t(y),p(z),q(w)
{}
vec4& operator=(const vec4& rhs)
{
x=rhs.x;
y=rhs.y;
z=rhs.z;
w=rhs.w;
return *this;
}
};
Oppure sto lavorando su un problema inesistente? C'è forse qualche dichiarazione speciale che consente l'accesso a membri sindacali inattivi identicamente tipizzati?
[correlati] (http://stackoverflow.com/questions/6512710/union-of-same-type-in-c) –