2016-03-23 23 views
7

Chương trình sau không biên dịch. Nhưng nếu tôi không bình luận ra operator==, nó sẽ biên dịch. Tại sao operator== vẫn cần thiết khi tôi đã cung cấp FooEqualKhông thể so sánh tiêu chuẩn :: unorded_set với tùy chỉnh KeyEqual

#include <cstddef> 
#include <unordered_set> 

struct Foo { 
}; 

struct FooHasher { 
    size_t operator()(const Foo&) const { 
    return 1; 
    } 
}; 

struct FooEqual { 
    bool operator()(const Foo& lhs, const Foo& rhs) const { 
    return true; 
    } 
}; 

// bool operator==(const Foo& lhs, const Foo& rhs) { 
// return true; 
// } 

int main() { 
    std::unordered_set<Foo, FooHasher, FooEqual> s1; 
    std::unordered_set<Foo, FooHasher, FooEqual> s2; 
    (void)(s1 == s2); 
    return 0; 
} 
+0

Phải là lỗi trong quá trình triển khai ... trừ khi thông số nói rằng 'KeqEqual' chỉ được sử dụng để chèn/tra cứu và' std :: unordered_set :: operator == 'kiểm tra xem hai tập hợp có bằng nhau hay không các yếu tố cá nhân so sánh bằng nhau? Có thể cần một luật sư ngôn ngữ C++ ở đây. – dreamlax

Trả lời

2

"23.2.5 container kết unordered" khẳng định:

hai thứ tự container a và b so sánh nếu a.size() == b.size() và, đối với mỗi nhóm tương đương = [Ea1, Ea2) thu được từ a.equal_range (Ea1), tồn tại một nhóm khóa tương đương [Eb1, Eb2) thu được từ b.equal_range (Ea1), khoảng cách đó (Ea1, Ea2) == khoảng cách (Eb1, Eb2) và is_permutation (Ea1, Ea2, Eb1) trả về giá trị true.

Tước này xuống, tất cả đi xuống đến bình đẳng của các thùng chứa không theo thứ tự được xác định theo điều khoản của std::is_permutation().

Phần quan trọng là điều này tham chiếu đến ba hình thức đối số là std::is_permutation(), chứ không phải dạng bốn đối số!

Nói cách khác, toàn bộ ngôi nhà của thẻ kết thúc được giảm xuống theo mặc định operator==, đối với nội dung của vùng chứa không theo thứ tự, thay vì hàm so sánh chính thức của vùng chứa.

Đó là bài đọc của tôi về điều này.

3

Theo http://en.cppreference.com/w/cpp/container/unordered_set/operator_cmp bạn trong thực tế cần operator== để so sánh (Tôi không có quyền truy cập vào tiêu chuẩn ngay bây giờ - Tôi sẽ cố gắng cập nhật với báo giá cụ thể đôi khi vào ngày mai):

Hành vi không xác định nếu Khóa không bình đẳng.

Các hành vi cũng là undefined nếu Hash và KeyEqual không có cùng hành vi trên LHS và RHS hoặc nếu toán tử so sánh bình đẳng cho chính không phải là một sự tinh tế của phân vùng vào tương đương với phím nhóm được giới thiệu bởi KeyEqual (có nghĩa là, nếu hai phím mà so sánh bằng rơi vào phân vùng khác nhau)

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