Đã có câu trả lời tuyệt vời về những lợi ích của việc sử dụng khởi tạo danh sách, tuy nhiên quy tắc cá nhân của tôi là KHÔNG sử dụng dấu ngoặc nhọn bất cứ khi nào có thể, mà thay vào đó làm cho nó phụ thuộc vào ý nghĩa khái niệm:
- Nếu đối tượng tôi đang tạo về mặt khái niệm giữ các giá trị mà tôi truyền trong hàm tạo (ví dụ: container, cấu trúc POD, nguyên tử, con trỏ thông minh, v.v.), thì tôi đang sử dụng dấu ngoặc nhọn.
- Nếu hàm tạo giống như một lệnh gọi hàm bình thường (nó thực hiện một số thao tác phức tạp hơn hoặc ít hơn được tham số hóa bởi các đối số) thì tôi đang sử dụng cú pháp gọi hàm bình thường.
- Để khởi tạo mặc định tôi luôn sử dụng dấu ngoặc nhọn.
Đối với một người, theo cách đó, tôi luôn chắc chắn rằng đối tượng được khởi tạo bất kể nó là lớp "thực" với hàm tạo mặc định sẽ được gọi bằng cách nào hoặc kiểu dựng sẵn / POD. Thứ hai, đó là - trong hầu hết các trường hợp - phù hợp với quy tắc đầu tiên, vì một đối tượng khởi tạo mặc định thường đại diện cho một đối tượng "trống".
Theo kinh nghiệm của tôi, quy tắc này có thể được áp dụng nhất quán hơn nhiều so với sử dụng dấu ngoặc nhọn theo mặc định, nhưng phải nhớ rõ tất cả các ngoại lệ khi chúng không thể được sử dụng hoặc có ý nghĩa khác với cú pháp gọi hàm "thông thường" với dấu ngoặc đơn (gọi là quá tải khác nhau).
Nó ví dụ phù hợp độc đáo với các loại thư viện tiêu chuẩn như std::vector
:
vector<int> a{10,20}; //Curly braces -> fills the vector with the arguments
vector<int> b(10,20); //Parentheses -> uses arguments to parametrize some functionality,
vector<int> c(it1,it2); //like filling the vector with 10 integers or copying a range.
vector<int> d{}; //empty braces -> default constructs vector, which is equivalent
//to a vector that is filled with zero elements
auto
?