Saya berurusan dengan kode yang telah ditulis bukan oleh saya. Saya memiliki pernyataan ini:
// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }
Jadi apa p < 0
artinya dalam konteks ini?
Pada halaman dokumentasi , saya percaya kasus saya adalah 16) y < nullptr
, di mana 0
adalah nullptr
.
Tapi apa fungsinya?
p==-1
adalah pegangan yang tidak valid. Karena2^64
jumlah yang luar biasa besar, setiap akal sehatp
selalu positif. Jadip<0
periksa untuk menangani WINAPI yang tidak valid. Ini bukan kode yang bagus.uint8_t*
(atau bahkan arrayuint8_t
)? Saya pikir mereka begituvoid*
, bukan?void*
mereka memiliki HANDLE_PTR makro atau sesuatu yang pada dasarnyalong*
iirc.Jawaban:
Cocok dengan overload (11) pada cppreference
operator<(const unique_ptr&, nullptr_t);
. 0 secara implisit dikonversi kestd::nullptr_t
. Sesuai dokumentasi, hasilnya adalahstd::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr)
.Hasilnya adalah implementasi yang didefinisikan, tetapi tanpa syarat salah pada sebagian besar sistem. Agaknya pada sistem eksotis di mana nol tidak memiliki representasi biner 0, hasilnya mungkin benar.
(16) adalah jalan di sekitar lainnya yang sama:
0 > unique_ptr
. Hasilnya sama.sumber
0
dipertimbangkannullptr
oleh kompiler? Saya pikir itu yang dia tanyakan. Setidaknya tidak masuk akal bagi saya.nullptr
(atau tergantung pada apa yang Anda maksud dengan pertimbangan). 0 secara implisit dikonversi kestd::nullptr_t
.0
kenullptr
, karena saya hanya melihat dua yang kompatibel dengan perbandingan boolean. Mereka sebanding, tetapi saya mendapat kesan bahwa mereka tidak dapat dikonversi.int x = nullptr
berbentuk buruk.std::nullptr_t
dirancang agar dapat digunakan dengan konstanta null pointer; bukan hanyanullptr
. 0 (dan juga 0L misalnya) adalah konstanta penunjuk nol, sehingga maksudnya adalah mereka dapat digunakan untuk membuat astd::nullptr_t
.Periksa yang
operator <
tidak kelebihan beban di suatu tempat di basis kode Anda. Yang tampaknya menjadi satu-satunya cara bagaimana(p < 0)
bisatrue
.Contoh:
Cetakan:
demo langsung
Kalau tidak seperti yang dikatakan orang lain,
0
secara implisit mengkonversistd::nullptr_t
, yang akan memilihbool operator<(const unique_ptr<T, D>& x, nullptr_t)
kelebihan yang akan memanggilstd::less(p, 0)
yang akan kembalifalse
(bahkan pada Windows dengan-1
nilai pointer).sumber
false
. Entah itu implementasi yang ditentukan atau tidak ditentukan (saya tidak yakin.) Tapi saya setuju bahwa itu mungkin akan mengembalikanfalse
sebagian besar (semua?) Implementasi. Lihat juga jawaban oleh @eerorikaUngkapan ini cocok dengan operator templat ini (0 dikonversi ke
nullptr
):Ini mengembalikan
std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)
yang selalu salah (seperti halnyastd::less
functor urutan ketat) ( demo ).sumber
false
. Apakah itu dilakukan adalah implementasi yang ditentukan atau tidak ditentukan. Mungkin selalu kembalifalse
meskipun pada sebagian besar (semua?) Implementasi saat ini.std::less
pengembalianfalse
.false
. Alasan praktisnya adalah bahwa nilai pointer nol diwakili oleh alamat serendah mungkin atau sesuatu di sepanjang garis itu.