Điều gì làm cho một thành viên công đoàn hoạt động?Điều gì làm cho một thành viên công đoàn hoạt động?
Tôi đã đọc chương 9.5 của tiêu chuẩn C++ 14 (một về công đoàn), nhưng tôi chưa tìm thấy câu trả lời rõ ràng cho những gì làm cho thành viên công đoàn hoạt động.
Có một lưu ý:
Nói chung, người ta phải sử dụng các cuộc gọi destructor rõ ràng và vị trí mới nhà khai thác để thay đổi thành viên tích cực của công đoàn.
Vì vậy, ví dụ,
union U {
int i;
short s;
} u;
new(&u.i) int(42);
Được rồi, vị trí thay đổi mới các thành viên tích cực, rõ ràng. Nhưng chúng ta thường không sử dụng vị trí mới khi làm việc với các loại với các nhà xây dựng tầm thường.
Có operator=
thay đổi thành viên đang hoạt động không có UB?
u.i = 42;
Ở đây, operator=
được gọi là đối tượng không bị cản trở. Nó được xác định rõ?
Điều này thì sao?
struct A {
int i0;
int i1;
};
union U {
A a;
short s;
} u;
Điều gì làm cho a
trở thành thành viên tích cực của u
? Cài đặt cả hai i0
& i1
có đủ không?
u.a.i0 = 42;
u.a.i1 = 99;
gì nếu tôi viết:
u.a.i0 = 42; // supposedly this doesn't change the active member to a, as i1 isn't set
int x = u.a.i0; // is it fine to read from a.i0? a is not an active member supposedly
Sau u.a.i0 = 42;
, các thành viên tích cực không được thay đổi để a
(tôi nghĩ), như vậy là nó UB làm int x = u.a.i0;
?
C++ 17 có cải thiện mô tả của các thành viên tích cực không?
"Ở đây,' điều hành = 'kêu gọi một unconstructed đối tượng "bạn có chắc không? Đó là POD vì vậy nó có vẻ tốt. – BartoszKP
Định nghĩa Laymen là đây là phần tử được viết cuối cùng. Nhưng tôi không thể tìm thấy bất kỳ sự chứng minh nào trong tiêu chuẩn này. – SergeyA
@BartoszKP: tốt, đó là DynamicType chắc chắn là (?) Không phải 'int', vì vậy ... Tôi không biết :) – geza