std::forward_list
cung cấp insert_after
và erase_after
thành viên có thể không cần truy cập thực tế đối tượng std::forward_list
. Do đó, chúng có thể được thực hiện như các hàm thành viên static
và được gọi mà không có đối tượng danh sách - hữu ích cho một đối tượng muốn xóa chính nó khỏi danh sách, đây là một cách sử dụng rất phổ biến. EDIT: Tối ưu hóa này chỉ áp dụng cho forward_list
các chuyên môn trên std::allocator
hoặc các trình phân bổ không trạng thái do người dùng xác định.Có thể std :: thành viên forward_list được triển khai tĩnh không?
Có thể triển khai tuân thủ tiêu chuẩn thực hiện việc này không?
§17.6.5.5/3 nói
A call to a member function signature described in the C++ standard library behaves as if the implementation declares no additional member function signatures.
với một chú thích
A valid C++ program always calls the expected library member function, or one with equivalent behavior. An implementation may also define additional member functions that would otherwise not be called by a valid C++ program.
Nó không rõ ràng với tôi cho dù thêm static
sẽ tạo ra một "khác biệt" hàm thành viên, nhưng loại bỏ một (implicit) đối số không nên phá vỡ bất cứ điều gì mà thêm đối số mặc định sẽ không, và đó là hợp pháp. (Bạn không thể lấy PTMF một cách hợp pháp đối với bất kỳ chức năng thành viên tiêu chuẩn nào.)
Tôi cho rằng thư viện phải được phép thực hiện việc này, nhưng tôi không chắc liệu một số quy tắc có bị hỏng hay không. Và các quy tắc chức năng thành viên được liệt kê như thế nào?
Thao tác danh sách đột biến yêu cầu quyền truy cập vào cấp phát của danh sách, vì vậy tôi nghi ngờ chúng có thể là tĩnh (đặc biệt là với các trình phân bổ trạng thái mới). –
Tuy nhiên, mẫu có thể được chuyên biệt cho trường hợp cực kỳ phổ biến của 'std :: allocator' và tương tự như vậy bởi người dùng cho riêng mình nếu muốn. – Potatoswatter
Làm thế nào bạn sẽ chuyên về điều này dựa trên kiến thức về * iterator * một mình? Trình lặp không biết danh sách thuộc về danh sách nào, cũng không phải danh sách cấp phát nào sử dụng. –