2015-06-03 18 views
6

Pointer toán tử quan hệ không xác định một trật tự tổng (§ 5.9 of the C++11 standard):`std :: less` hoạt động như thế nào?

Nếu hai con trỏ pq của điểm cùng loại với các đối tượng khác nhau mà không phải là thành viên của cùng một đối tượng hoặc các yếu tố của mảng tương tự hoặc với các chức năng khác nhau hoặc nếu chỉ một trong số chúng là null, kết quả của p<q, p>q, p<=qp>=q không được chỉ định.

std::less tài liệu nói:

Các đặc tả từng phần của std::less cho bất kỳ loại con trỏ mang lại một trật tự tổng, thậm chí nếu được xây dựng trong operator< không.

Làm thế nào để tổng số đơn đặt hàng này từ một phần đơn hàng?


Tôi không thể trả lời cho câu hỏi này bằng cách nhìn vào /usr/include/c++/4.9/bits/stl_function.h cho struct less định nghĩa:

template<typename _Tp = void> 
    struct less; 

    template<typename _Tp> 
    struct less : public binary_function<_Tp, _Tp, bool> 
    { 
     bool 
     operator()(const _Tp& __x, const _Tp& __y) const 
     { return __x < __y; } 
    }; 

    template<> 
    struct less<void> 
    { 
     template <typename _Tp, typename _Up> 
     auto 
     operator()(_Tp&& __t, _Up&& __u) const 
     noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u))) 
     -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u)) 
     { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); } 

     typedef __is_transparent is_transparent; 
    }; 

Trả lời

4

Làm thế nào để nó mang lại tổng số thứ tự này từ một trật tự một phần?

Tiêu chuẩn hiếm khi nói cách một cái gì đó nên được thực hiện. Thay vào đó, nó nói những gì được yêu cầu. Và đây chính xác là trường hợp. Tiêu chuẩn này đòi hỏi std::less để cung cấp một trật tự tổng, trong §20.9.6/14:

Đối với các mẫu lớn hơn, ít hơn, greater_equal, và less_equal, các chuyên ngành cho bất kỳ loại con trỏ mang lại một trật tự tổng, ngay cả khi các toán tử dựng sẵn <,>, < =,> = không.

trong khi hành vi operator< 's trong vấn đề này là không xác định theo §5.9/4 (câu trích dẫn mà bạn có trong câu hỏi của bạn).

hành vi Unspecified được định nghĩa trong §1.3.25 nghĩa:

hành vi, cho một cấu trúc cũng như hình thành chương trình và dữ liệu chính xác, mà phụ thuộc vào việc thực hiện [...]

Trong triển khai cụ thể của bạn, operator< đã cung cấp tổng số đơn đặt hàng (có thể do loại con trỏ của bạn được triển khai dưới dạng địa chỉ 32 bit hoặc 64 bit, có thể dễ dàng được hiểu là một thứ tương tự như số nguyên không dấu, cho tổng số thứ tự), do đó std::less chỉ đơn giản là chuyển tiếp các đối số của nó cho toán tử đó.

+0

Cảm ơn bạn, câu trả lời của bạn là hoàn hảo. Tuy nhiên, bạn có biết bất kỳ việc thực thi 'toán tử <' nào không cung cấp tổng số thứ tự không? Cách triển khai 'std :: less' mang lại tổng số thứ tự từ nó như thế nào? – rom1v

+0

@ rom1v Tôi không biết về sự tồn tại của việc triển khai như vậy.Tôi khá chắc chắn nó tồn tại, xem xét cẩn thận các ủy ban tiêu chuẩn quyết định những gì đi như một yêu cầu và những gì đi như * hành vi không xác định *. – Shoe

+1

Tôi không chắc nó vẫn tồn tại. Phần lớn điều này đến từ những ngày gần và xa. – Nevin

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