xem xét cấu trúc sau:Đang đọc thành viên công đoàn không hoạt động cùng loại với một người đang hoạt động được xác định rõ?
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};
};
Something như thế này dường như được sử dụng trong ví dụ GLM để cung cấp các loại GLSL giống như vec4
, vec2
vv ..
Nhưng mặc dù việc sử dụng dự kiến cũng giống như để làm cho có thể
vec4 a(1,2,4,7);
a.x=7;
a.b=a.r;
này, nó có vẻ là một hành vi không xác định, bởi vì, như trích dẫn here ,
Trong liên minh, tối đa một trong các thành viên dữ liệu có thể hoạt động bất kỳ lúc nào, nghĩa là giá trị tối đa một trong các thành viên dữ liệu có thể được lưu trữ trong liên minh bất kỳ lúc nào.
Sẽ không tốt hơn nếu ví dụ: sử dụng chỉ cần xác định cấu trúc một cái gì đó như sau?
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;
}
};
Hoặc tôi đang làm việc xung quanh vấn đề không tồn tại? Có lẽ một số tuyên bố đặc biệt cho phép truy cập vào các thành viên công đoàn không được đánh máy giống hệt nhau không?
[Liên quan] (http://stackoverflow.com/questions/6512710/union-of-same-type-in-c) –