khởi tạo struct với {0}


8

Tôi đang gỡ lỗi một số mã về cơ bản là giống hệt với mã này:

struct Foo { int a; int b; };
struct Bar { Bar() {} Foo foo{0}; };

Khi tôi tạo một thể hiện của Barnó, có vẻ như cả hai abđược khởi tạo về không. Điều này có được đảm bảo không? Tôi có thể tìm thấy nó ở đâu trong thông số kỹ thuật?


thử: struct Foo { int a{}; int b{}; };nhớ các dấu ngoặc nhọn sau tên biến. sau đó bạn sẽ luôn nhận được các giá trị khởi tạo. nếu bạn cần khởi tạo với các giá trị khác, với hành vi được xác định, bạn cần viết một ctor giống như cho mọi lớp khác
skratchi.at

@ skratchi.at Đó không phải là dấu ngoặc đơn (sử dụng dấu ngoặc đơn có nghĩa là một cái gì đó khác)
Các cuộc đua Lightness trong Orbit

1
Một câu hỏi đơn giản như vậy trên bề mặt, nhưng init C ++ phức tạp đến mức tôi hiểu tại sao bạn lại hỏi nó. Tôi có thể mạo hiểm đoán rằng bạn đang nhận được init tổng hợp thích hợp ở đây nhưng không đi sâu vào tiêu chuẩn tôi không chắc câu trả lời là gì. Thật buồn làm sao?
Các cuộc đua nhẹ nhàng trong quỹ đạo

Cái này dành cho mảng, nhưng ... stackoverflow.com/questions/1065774/ từ
YSC

Một câu hỏi tương tự khác: stackoverflow.com/questions/1069621/
Kẻ

Câu trả lời:


3

Theo cppreference.com

Nếu số lượng mệnh đề khởi tạo ít hơn số lượng thành viên [và cơ sở (kể từ C ++ 17)] hoặc danh sách trình khởi tạo hoàn toàn trống, các thành viên còn lại [và cơ sở (kể từ C ++ 17)] được khởi tạo [bởi Các trình khởi tạo thành viên mặc định, nếu được cung cấp trong định nghĩa lớp và mặt khác (kể từ C ++ 14)] bởi các danh sách trống, theo các quy tắc khởi tạo danh sách thông thường (thực hiện khởi tạo giá trị cho các loại không phải lớp và các lớp không tổng hợp với các hàm tạo mặc định và khởi tạo tổng hợp cho các tổng hợp). Nếu một thành viên của loại tham chiếu là một trong những thành viên còn lại, chương trình không được định dạng.

Fookhông có bộ khởi tạo thành viên mặc định ( int b{0};), do đó bsẽ được khởi tạo bằng cách khởi tạo danh sách với một danh sách trống, có nghĩa là khởi tạo giá trị cho các loại không phải là lớp : b = int() // = 0.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.