Trong C++ 11, nó có vẻ như đó là pháp lý để khởi tạo một std::map<std::string, int>
như sau:Quy tắc ngôn ngữ nào cho phép C++ 11 suy ra rằng đây là một initializer_list của các cặp?
std::map<std::string, int> myMap = {
{ "One", 1 },
{ "Two", 2 },
{ "Three", 3 }
};
trực giác, điều này làm cho tinh thần - initializer cú đúp kín là một danh sách các cặp của chuỗi, và std::map<std::string, int>::value_type
là std::pair<std::string, int>
(có thể với một số bằng cấp const
.
Tuy nhiên, tôi không chắc mình hiểu cách gõ hoạt động ở đây. Nếu chúng ta loại bỏ khai báo biến ở đây và chỉ có trình khởi tạo kèm theo dấu ngoặc đơn, trình biên dịch sẽ không biết rằng đang nhìn vào một std::initializer_list<std::pair<std::string, int>>
bởi vì nó sẽ không biết rằng các cặp braced lại trình bày std::pair
s. Do đó, có vẻ như trình biên dịch bằng cách nào đó trì hoãn hành động gán kiểu cho bộ khởi tạo ngoặc kèm theo cho đến khi nó có đủ thông tin kiểu từ hàm tạo std::map
để nhận ra rằng các dấu ngoặc lồng nhau là cho các cặp. Tôi không nhớ bất cứ điều gì như thế này xảy ra trong C++ 03; theo hiểu biết tốt nhất của tôi, loại biểu thức không bao giờ phụ thuộc vào ngữ cảnh của nó.
Quy tắc ngôn ngữ nào cho phép mã này biên dịch chính xác và để trình biên dịch xác định loại nào sẽ sử dụng cho danh sách bộ khởi tạo? Tôi đang hy vọng cho câu trả lời với các tài liệu tham khảo cụ thể để spec C++ 11, vì nó thực sự thú vị mà công trình này!
Cảm ơn!
Các danh sách có ngoặc nhọn trong C++ 03 đã rất cụ thể đối với ngữ cảnh khởi tạo. Không có sự khác biệt đáng kể ở đây từ một tổng hợp lồng nhau C++ 03 (có thể 'std :: pair myArray []') được khởi tạo bằng cách sử dụng dấu ngoặc, ngoại trừ kiểu không được đặt tên trực tiếp, nó được suy ra từ các nhà thầu có sẵn. –
BTW, toán tử chuyển đổi ngầm (toán tử 'thành viên T()') là nơi khác mà bối cảnh xác định loại biểu thức (và được sử dụng để phân giải quá tải). –
'braced-init-list' không phải là biểu thức và không có loại. Không có khấu trừ, chỉ có độ phân giải quá tải giữa các nhà xây dựng danh sách khởi tạo (trong đó chỉ có một) – Cubbi