Saat memanggil std::sort()
pada 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));
}
Baik gcc dan dentang mengembalikan kesalahan pada jenis di std::array
- dentang kata
error: penggunaan 'sort' pengidentifikasi yang tidak dideklarasikan; maksud Anda 'std :: sort'?
Mengubah untuk std::sort(begin(foo2), end(foo2))
memperbaiki masalah.
MSVC mengkompilasi kode di atas seperti yang tertulis.
Mengapa perbedaan perlakuan antara std::vector
dan std::array
; dan kompiler mana yang benar?
std::sort
yang mengarah ke pencarian bergantung pada argumen (seperti yang sudah Anda miliki untuk std::begin
dan std::end
)?
namespace std
bahkan di mana tipe pointer sederhana akan bekerja. Saya percaya ini adalah untuk memasukkan pemeriksaan debug-build untuk mendeteksi overruns dan kesalahan umum lainnya.
sort(...
->std::sort(...
. Saya kira ADL (lookup tergantung argumen) adalah apa yang membuat Anda tersandung. Itu, atau panduan deduksi. Bagaimanapun juga; selalu memenuhi syarat fungsi yang Anda panggil.