tôi đã làm mới sự hiểu biết của tôi về giá trị khởi động so với mặc định-khởi động, và tình cờ gặp this:Tại sao hành vi này không được xác định đơn giản?
struct C {
int x;
int y;
C() { }
};
int main() {
C c = C();
}
Rõ ràng đây là UB vì
Trong trường hợp C(), có một constructor có khả năng khởi tạo các thành viên x và y, vì vậy không có khởi tạo diễn ra. Cố gắng sao chép C() thành c do đó dẫn đến hành vi không xác định.
Tôi nghĩ rằng tôi hiểu tại sao, nhưng tôi không chắc chắn. Ai đó có thể vui lòng xây dựng?
Điều đó có nghĩa là đây cũng là UB?
int x; x = x;
Ngẫu nhiên, liên quan đến khởi tạo giá trị, sau đây có được đảm bảo bằng không không?
int x = int();
Không chắc chắn ý của bạn là gì. Nếu bạn có nghĩa là giá trị của x và y sẽ được uninitialized sau đó có, nhưng bạn đã trả lời câu hỏi của riêng bạn sau đó (như constructor không làm việc đó). Đối với C c = C(); Tôi nghĩ điều đó hoàn toàn hợp lệ. – Sid
Tôi nghĩ nó cũng hoàn toàn hợp lệ, cho đến khi ai đó tuyên bố khác. Khi tôi đọc nó, đoạn đầu tiên chỉ có thể bằng UB nếu đoạn thứ hai cũng là, nếu không nó là một giá trị uninitialised đơn giản, không có mũi deamons. – spraff
@Sid: Không, sử dụng giá trị của đối tượng chưa được khởi tạo cho hành vi không xác định. –