2013-04-27 27 views
10

Có phải là để đảm bảo rằng các giá trị std::type_info::hash_code() giống nhau ngụ ý cùng một loại?std :: type_info :: hash_code() duy nhất và ý nghĩa của "nên"

Cplusplus.com dường như khẳng định như vậy:

Hàm này trả về giá trị tương tự cho bất kỳ hai type_info đối tượng so sánh bình đẳng, và giá trị khác nhau với nhiều loại khác nhau mà không làm. [tôi nhấn mạnh]

Cppreference dường như khẳng định điều ngược lại:

Trả về một giá trị không xác định, đó là giống hệt nhau cho các đối tượng, đề cập đến cùng loại. Không có đảm bảo nào khác được cung cấp, cụ thể là giá trị có thể thay đổi giữa các lời gọi của cùng một chương trình. [Nhấn mạnh tôi]

Các tiêu chuẩn có liên quan đoạn là:

§ p18.7.1 p7-8

size_t hash_code() noexcept const;

7 Trả về: Giá trị không xác định, ngoại trừ trong một lần thực hiện chương trình, nó sẽ trả về cùng một giá trị cho bất kỳ hai đối tượng type_info nào so sánh bằng nhau.

8 Lưu ý: thực hiện nên trả về các giá trị khác nhau cho hai đối tượng type_info không so sánh bằng nhau. [tôi nhấn mạnh]

ý nghĩa của "nên" nghĩa vụ phải được trong bối cảnh trên là gì? Nếu đoạn 8 có nghĩa là một yêu cầu, thì có vẻ như không thể thực hiện trừ khi thời gian chạy thực hiện một số kiểu duy nhất toàn cầu trên tất cả các tên biểu tượng trong một chương trình để đảm bảo thiếu va chạm băm, mà dường như là một gánh nặng khá lớn đối với tiêu chuẩn để foist khi triển khai, đặc biệt là cho một chức năng gọi là hash_code(). (Itanium thực sự đòi hỏi này, nhưng nó rõ ràng một yêu cầu thêm trên tiêu chuẩn.)

Nếu "nên" không có nghĩa là để được ràng buộc, sau đó nhận xét có vẻ là một vô nghĩa và một khiếm khuyết trong tiêu chuẩn, kể từ khi yêu cầu thực hiện để cố gắng thực hiện một yêu cầu khó khăn mà không thể dựa vào dù sao cũng không cung cấp giá trị và chỉ mời sự nhầm lẫn và phân mảnh. Có ai biết tại sao nó ở đó không?

CHỈNH SỬA: Có thể "lỗi" quá mạnh, nhưng ít nhất đó là điểm nhầm lẫn có thể được làm rõ, vì dường như đã bị nhầm lẫn ít nhất một trang web tham chiếu và lừa đảo bất cứ ai dựa vào nó. Hơn nữa, nó thực sự là có thể đáp ứng yêu cầu (miễn là số loại được hỗ trợ bởi việc triển khai nhỏ hơn phạm vi size_t) nếu tính toàn cục được thực hiện trong thời gian chạy và không rõ liệu tiêu chuẩn có đang đề xuất đây là chiến lược thực hiện lý tưởng hay không.

Trả lời

5

Ý nghĩa khá rõ ràng đối với tôi: nó không phải là yêu cầu tuyệt đối bởi vì nó có thể không đáp ứng trong một số trường hợp, nhưng việc thực hiện nên cố gắng tạo ra các giá trị duy nhất trong phạm vi có thể.

Tôi muốn lưu ý rằng điều này cũng đúng với mã băm nói chung - bạn cố gắng tạo ra các giá trị duy nhất nhưng không phải lúc nào cũng có thể.

Chuẩn có chứa thông tin không thể thực thi được. Khá một chút (nhưng chắc chắn không phải tất cả) là ở dạng rõ ràng Note s, nhưng điều đó không có nghĩa là mọi thứ không quy chuẩn bên ngoài Ghi chú là lỗi.

Chỉnh sửa: trong trường hợp ai đó muốn biết ISO nói gì về cách viết tiêu chuẩn, họ có page of guidelines.

+0

OK, tôi nghĩ bạn nói đúng, nhưng điều đó khiến mọi thứ khó hiểu. Đối với một điều, 'cplusplus.com' là trong lỗi và bất cứ ai dựa vào nó có mã lỗi. –

+0

(Vì vậy, cần được làm rõ ít nhất) –

+4

@StephenLin: Tôi đồng ý rằng cplusplus.com bị lỗi. Nó không được biết đến là đặc biệt chính xác. cppreference.com dường như đáng tin cậy hơn ít nhất là một quy tắc chung. –