Trong tài liệu CppCon 2014 "Type Deduction and Why You Care", Scott Meyers đặt ra câu hỏi tại sao có quy tắc đặc biệt về auto
và khởi tạo nhanh trong tiêu chuẩn C++ 11/C++ 14 (câu hỏi bắt đầu at 36m05s).Tại sao có quy tắc khấu trừ loại đặc biệt cho trình khởi chạy tự động và được đặt trong C++ 11/C++ 14?
Ngữ nghĩa của tự động kết hợp với dấu ngoặc đơn-init-list được định nghĩa trong §7.1.6.4/6.
Tôi đã nghĩ về điều đó và không thể đưa ra trường hợp sử dụng. Điều gần nhất mà tôi đã thấy cho đến nay là một ví dụ mà Bjarne Stroustrup đã sử dụng nó.
Trong Cpp 2014 talk "Make Simple Tasks Simple!" của mình, anh ta từng sử dụng auto
để bắt người khởi tạo (nhưng chỉ là cách giải quyết).
Đây là mã (một phần của trượt 30, at 37m10s):
// auto ss1 = collect({ 1, 2, 3, 4, 5, 6 }, odd); // error: Bummer!
auto lst = { 1, 2, 3, 4, 5, 6 };
auto ss2 = collect(lst, odd); // {1,3,5}
Nhưng lưu ý rằng nó chỉ là một cách giải quyết. Ông nói rằng nó không cần thiết. Thay vào đó, anh ta muốn trực tiếp truyền các đối số cho hàm. Vì vậy, nó không thể thực sự phục vụ như một động lực tốt cho auto
và danh sách khởi tạo.
Hiểu biết của tôi về C++ không đủ sâu để đánh giá nhược điểm của việc cho phép danh sách khởi tạo trong ví dụ của Bjarne, như ông đề xuất. Dù sao, nó sẽ tránh sự cần thiết cho auto
trong trường hợp đó.
Vì vậy, là auto
và danh sách trình khởi tạo chỉ là giải pháp cho một thứ có thể được giải quyết tốt hơn? Hoặc có những ví dụ hay, trong đó quy tắc khấu trừ tự động bổ sung trong §7.1.4.4/6 có hữu ích không?
Tôi chắc rằng có đề xuất C++ 1z để tạo 'auto x = {expr};' sử dụng loại 'expr' (trừ cho phép toán tử dấu phẩy không được dấu ngoặc đơn). Tôi không chắc chắn loại khác để sử dụng cho một danh sách đầy đủ, mặc dù. – chris
@christ Tôi nghĩ bạn có nghĩa là N3922. Scott Meyers cũng đề cập đến điều đó. Visual Studio đã thực hiện nó, mặc dù nó không phải là một phần của C++ 14. Đây là liên kết: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3922.html –
Ah, đó là một. Mặc dù tôi * loại * phải không đồng ý với cái chung vì việc sử dụng này. Tôi thực sự thích rằng để được hình thành bệnh và initializer danh sách có thể được thông qua vào các chức năng mà không có dòng phụ, mặc dù. – chris