Tại sao không std::initializer_list
ngôn ngữ cốt lõi không được tích hợp sẵn?
Đối với tôi, có vẻ như đó là một tính năng khá quan trọng của C ++ 11 và nó không có từ khóa dành riêng (hoặc một cái gì đó tương tự).
Thay vào đó, initializer_list
nó chỉ là một lớp mẫu từ thư viện tiêu chuẩn có ánh xạ ngầm, đặc biệt từ cú pháp giằng-init-list {...}
mới do trình biên dịch xử lý.
Thoạt nghĩ, giải pháp này khá hacky .
Đây có phải là cách mà các bổ sung mới cho ngôn ngữ C ++ hiện sẽ được thực hiện: bởi các vai trò ngầm định của một số lớp mẫu chứ không phải bởi ngôn ngữ cốt lõi ?
Vui lòng xem xét các ví dụ sau:
widget<int> w = {1,2,3}; //this is how we want to use a class
tại sao một lớp mới được chọn:
widget( std::initializer_list<T> init )
thay vì sử dụng một cái gì đó tương tự với bất kỳ ý tưởng nào sau đây:
widget( T[] init, int length ) // (1)
widget( T... init ) // (2)
widget( std::vector<T> init ) // (3)
- một mảng cổ điển, bạn có thể thêm
const
ở đây và ở đó - ba dấu chấm đã tồn tại trong ngôn ngữ (var-args, bây giờ là các mẫu biến thể), tại sao không sử dụng lại cú pháp (và tạo cảm giác nó được tích hợp sẵn )
- chỉ một vùng chứa hiện có, có thể thêm
const
và&
Tất cả chúng đã là một phần của ngôn ngữ. Tôi chỉ viết 3 ý tưởng đầu tiên của mình, tôi chắc chắn rằng còn nhiều cách tiếp cận khác.
std::array<T>
không phải là 'một phần của ngôn ngữ' hơn std::initializer_list<T>
. Và đây không phải là những thành phần thư viện duy nhất mà ngôn ngữ dựa vào. Xem new
/ delete
,, type_info
các loại ngoại lệ khác nhau size_t
, v.v.
const T(*)[N]
, bởi vì điều đó hoạt động rất giống với cách std::initializer_list
hoạt động.