là C
có thể sử dụng trong thuật toán tiêu chuẩn như std::sort
rằng hiện đang sử dụng mặc định <
điều hành?
Có, nó hoạt động cho std::sort()
và một số thuật toán chuẩn khác. Mã số
#include <algorithm>
#include <vector>
struct C
{
/* Class contents, without any arithmetic operator... */
constexpr operator int() noexcept {return 0;} // Implicit conversion to int
};
int main()
{
std::vector<C> v;
std::sort(begin(v), end(v));
}
biên dịch. Here's a live demo. Hãy nhìn vào câu hỏi tiếp theo!
Là C
được coi là đáp ứng ý tưởng LessThanComparable
?
số Các yêu cầu của các khái niệm LessThanComparable
là, rằng các đối tượng x
và y
loại C
hoặc const C
biểu thức x<y
là hợp lệ và mặc nhiên chuyển đổi thành bool và các nhà điều hành <
thiết lập một mối quan hệ đặt hàng yếu nghiêm ngặt. Trong trường hợp của bạn, các đối tượng const sẽ không chuyển đổi thành int
s. Đây là một lỗi trong mã của bạn, bởi vì nó không phải là const đúng. Việc thêm từ khóa const
sẽ làm cho từ khóa hoạt động và lớp học C
thực sự sẽ là LessThanComparable
. Mối quan hệ đặt hàng yếu kém nghiêm ngặt được đáp ứng, bởi vì int
s thực hiện yêu cầu này.
sẽ C
đáp ứng các yêu cầu của một conceptified thư viện thuật toán giả thuyết rằng sẽ yêu cầu các loại được LessThanComparable
.
Nếu bạn sửa chữa constness của bạn, có, nó sẽ.
Một vài sidenotes:
GCC 4.9 biên dịch x<y
ngay cả khi x
và y
là loại const C
. Điều này có vẻ là một lỗi trình biên dịch, kể từ GCC 5.2 và clang 3.6 ném một lỗi thời gian biên dịch ở đây.
Chuyển std::less<C>()
làm đối số bổ sung cho std::sort()
đưa ra lỗi thời gian biên dịch, vì hàm so sánh yêu cầu đối tượng không đổi có thể so sánh được trong trường hợp đó. Tuy nhiên, việc đi qua std::less<void>()
không làm hỏng bất kỳ điều gì, vì các đối số được chuyển tiếp hoàn hảo.
std::sort()
algorithm không yêu cầu đầy đủ LessThanComparable
, nhưng khái niệm Compare
. Hơn nữa, loại trình vòng lặp phải là RandomAccessIterator
là ValueSwappable
và loại tham chiếu phải là MoveContructable
và MoveAssignable
. Đây là tất cả các trường hợp cho câu hỏi đầu tiên của bạn, ngay cả khi lỗi constness không cố định. Đó là lý do tại sao std::sort()
và các thuật toán chuẩn khác hoạt động.
Nguồn
2015-12-29 09:47:06
Tôi đã tò mò và thử nó. Làm việc trên C++ 14 ở đây: http://cpp.sh/4hdh –