Chúng tôi đã cắn lỗi sau nhiều lần:Làm thế nào để tôi so sánh mối quan hệ của con trỏ thành một lỗi?
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print(int* pn) { cout << *pn << " "; }
int main() {
int* n1 = new int(1);
int* n2 = new int(2);
int* n3 = new int(3);
vector<int*> v;
v.push_back(n1);
v.push_back(n2);
v.push_back(n3);
sort(v.begin(), v.end()); // Here be dragons!
for_each(v.begin(), v.end(), print);
cout << endl;
delete n1; delete n2; delete n3;
}
Vấn đề là std :: sort được so sánh con trỏ số nguyên không số nguyên, mà không phải là những gì các lập trình viên mong muốn. Tồi tệ hơn, đầu ra có thể xuất hiện chính xác và xác định (xem xét thứ tự các địa chỉ được trả về bởi mới hoặc được cấp phát trên ngăn xếp). Các vấn đề gốc là sắp xếp cuối cùng gọi nhà điều hành < cho T, mà hiếm khi là một ý tưởng tốt khi T là một loại con trỏ.
Có cách nào để ngăn chặn điều này hoặc ít nhất có được cảnh báo trình biên dịch không? Ví dụ, có cách nào để tạo ra một phiên bản tùy chỉnh của std :: sắp xếp rằng yêu cầu một hàm so sánh khi T là một con trỏ?
Chúng tôi đã bị lỗi này cắn nhiều lần. Đó là lý do tại sao tôi quan tâm đến câu hỏi này. Tôi không nghĩ rằng bất cứ ai đã thực sự nứt nó, mặc dù. Những gì chúng ta cần là cái gì đó để đảm bảo loại điều này không biên dịch, vì vậy khi bạn làm điều đó sau khi tất cả-nighter khác, nó không thể có được trái trong mã. –
Mỗi khi tôi cố gắng đưa ra một cái gì đó hữu ích để nói ở đây, tất cả đều nắm bắt để "có được các nhà phát triển thông minh hơn". Sau đó, tôi nhận ra rằng những điều đơn giản như thế này cũng xảy ra với các nhà phát triển thông minh. Chắc chắn lưu giữ các ghi chú (wiki?) Trên các lỗi "được truy cập nhiều nhất" xuất hiện trên mã của bạn và chú ý hơn đến chúng trong quá trình đánh giá mã. Gấp đôi như vậy trên các nhà phát triển cơ sở. – corsiKa