【发布时间】:2015-06-14 07:24:49
【问题描述】:
考虑以下结构:
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};
};
类似的东西似乎用于例如GLM 提供类似 GLSL 的类型,例如 vec4、vec2 等。
但是虽然预期的用途是让这成为可能
vec4 a(1,2,4,7);
a.x=7;
a.b=a.r;
,这似乎是一种未定义的行为,因为引用here,
在一个联合中,任何时候最多可以有一个数据成员处于活动状态,即任何时候最多可以有一个数据成员的值存储在一个联合中。
难道不是更好吗?使用只需定义类似以下的结构吗?
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;
}
};
还是我正在解决一个不存在的问题?是否有一些特殊的声明允许访问相同类型的非活动工会成员?
【问题讨论】:
标签: c++ undefined-behavior unions