Khi gọi std::sort()
trên std::array
:
#include <vector>
#include <array>
#include <algorithm>
int main() {
std::vector<int> foo{4, 1, 2, 3};
sort(begin(foo), end(foo));
std::array<int, 4> foo2{4, 1, 2, 3};
sort(begin(foo2), end(foo2));
}
Cả gcc và clang đều trả về lỗi trên sắp xếp trên std::array
- clang nói
lỗi: sử dụng định danh không khai báo 'sort'; ý bạn là 'std :: sort'?
Thay đổi để std::sort(begin(foo2), end(foo2))
khắc phục vấn đề.
MSVC biên dịch mã ở trên như văn bản.
Tại sao sự khác biệt trong điều trị giữa std::vector
và std::array
; và trình biên dịch nào là đúng?
std::sort
dẫn đến tra cứu phụ thuộc vào đối số (như bạn đã có std::begin
và std::end
)?
namespace std
ngay cả khi một loại con trỏ đơn giản sẽ hoạt động. Tôi tin rằng điều này là để chèn kiểm tra gỡ lỗi để phát hiện lỗi tràn và các lỗi phổ biến khác.
sort(...
->std::sort(...
. Tôi đoán rằng ADL (tra cứu phụ thuộc đối số) là thứ khiến bạn vấp ngã. Đó, hoặc hướng dẫn khấu trừ. Trong bất kỳ trường hợp nào; luôn luôn đủ điều kiện các chức năng bạn gọi.