2013-10-02 13 views
7

This page từ cppreference đề cập rằng std::hash đã được chuyên biệt cho std::optional, nhưng không chỉ định hành vi khi đối tượng được thảnh thơi. Tôi có thể nghĩ đến hành vi khác nhau:Hash của một std thảnh thơi :: tùy chọn <T> đối tượng là gì?

  • Nó có thể ném một std::bad_optional_access, để phù hợp với std::optional::value
  • Nó có thể trở lại cùng bảng băm cho mỗi thảnh thơi std::optional<T>, cách 2 đối tượng thảnh thơi này sẽ có cùng bảng băm.
  • Nó có thể trở lại một std::optional<std::hash<std::optional<T>>>
+0

Điều cuối cùng là vui nhộn, nhưng thực sự không có ý nghĩa: -S Lạ lùng, tuy nhiên, điều này không được chỉ định. Sau đó, một lần nữa, ngôn ngữ chưa được xuất bản. Boost làm như thế nào? –

+0

Lưu ý rằng 'tùy chọn' đã bị xóa khỏi C++ 14. – Simple

+2

@Simple Đó là? Bạn có xảy ra liên kết đến báo cáo với lý do không? Tôi rất muốn biết – nijansen

Trả lời

6

C++ 14 CD nói trong [optional.hash]/3:

Đối với một đối tượng o loại optional<T>, nếu bool(o) == true, hash<optional<T>>()(o) tổ chức thẩm định với cùng giá trị với hash<T>()(*o).

Vì vậy, tôi sẽ nói nó không xác định hàm băm trả về cho một đối tượng thảnh thơi.

+0

để tính toán giá trị băm của một 'tùy chọn ' là ** không xác định hành vi**. – qdii

+3

@qdii, không xác định không giống như không xác định.Sau khi chèn một phần tử vào một 'std :: vector' được xây dựng mặc định, dung lượng của vectơ là _unspecified_, vì nó có thể lấy bất kỳ giá trị nào lớn hơn 0, nhưng nó không phải là hành vi không xác định để sử dụng vectơ. Nếu 'hash >' có mệnh đề _Requires_ cho biết điều kiện tiên quyết tôi sẽ đồng ý rằng nó không xác định, nhưng vì tôi không chắc chắn. Tôi chắc chắn không nghĩ rằng hành vi không xác định được dự định. –

+0

Đây là [LWG2333] (http://cplusplus.github.io/LWG/lwg-active.html#2333) và sẽ được giải quyết trong TS cơ bản về thư viện chỉ định 'std :: experiment :: optional' –

1

Tôi không chắc chắn nếu nó có liên quan nữa, vì C++ 14 không có std::optional cuối cùng. Ý định (mặc dù không được phản ánh trong tiêu chuẩn ban đầu) luôn luôn là băm của một đối tượng tùy chọn thảnh thơi trả về một giá trị không xác định, như Jonathan nói.

Mục đích này được phản ánh trong Fundamentals TS.

Ý tưởng là việc triển khai Thư viện chuẩn chọn cách nó muốn đại diện cho một hình ảnh được giải phóng optional<T> và tự ghi lại. Nó có thể chọn một giá trị khác nhau cho các loại khác nhau, và cũng có một giá trị khác nhau trong chế độ gỡ lỗi và phát hành.

Các vấn đề liên quan