Standar tidak mengharuskan ini untuk dikompilasi di rantai alat apa pun !
Ingat pertama yang vector<bool>
aneh dan berlangganan itu memberi Anda objek sementara dari jenis proxy yang disebut std::vector<bool>::reference
, bukan yang sebenarnya bool&
.
Pesan kesalahan memberitahu Anda bahwa itu tidak dapat mengikat ini sementara untuk const
referensi non- nilai dalam template <typename T> std::swap(T& lhs, T& rhs)
implementasi generik .
Ekstensi!
Namun, ternyata libstdc ++ mendefinisikan overload untuk std::swap(std::vector<bool>::reference, std::vector<bool>::reference)
, tetapi ini merupakan perluasan ke standar (atau, jika ada di sana, saya tidak dapat menemukan bukti untuk itu).
libc ++ juga melakukan ini .
Saya kira implementasi Visual Studio stdlib, yang masih Anda gunakan, tidak , tapi kemudian untuk menambah penghinaan Anda dapat mengikat temporaries ke nilai referensi di VS (kecuali jika Anda menggunakan mode kesesuaian), jadi std::swap
fungsi standar, "generik", berfungsi sampai Anda mengganti kompiler VS untuk kompiler Dentang yang lebih ketat.
Akibatnya, Anda telah mengandalkan ekstensi pada ketiga rantai alat yang berfungsi untuk Anda, dan kombinasi Dentang Windows adalah satu-satunya yang benar-benar menunjukkan kepatuhan yang ketat.
(Menurut pendapat saya, ketiga alat itu seharusnya mendiagnosis hal ini sehingga Anda tidak mengirimkan kode non-portabel selama ini. 😊)
Apa sekarang?
Mungkin tergoda untuk menambahkan spesialisasi Anda sendiri std::swap
dan std::vector<bool>::reference
, tetapi Anda tidak diizinkan melakukan ini untuk tipe standar; memang, itu akan bertentangan dengan kelebihan yang libstdc ++ dan libc ++ telah memilih untuk ditambahkan sebagai ekstensi.
Jadi, agar portabel dan sesuai, Anda harus mengubah kode Anda .
Mungkin yang kuno:
const bool temp = vb[0];
vb[0] = vb[1];
vb[1] = temp;
Atau manfaatkan fungsi anggota statis khusus yang melakukan persis seperti yang Anda inginkan :
std::vector<bool>::swap(vb[0], vb[1]);
Dapat juga dieja sebagai berikut:
vb.swap(vb[0], vb[1]);
operator[]
nilai yang lebih rendah? dan dapatstd::swap
beroperasi pada nilai dan nilai?