unique_ptr <0 VEYA operatörden daha az ne yapar?


9

Benim tarafımdan yazılmamış kodla uğraşıyorum. Bu ifade var:

// p is type of std::unique_ptr<uint8_t[]>
if (p < 0) { /* throw an exception */ }

Peki p < 0bu bağlamda ne anlama geliyor?
Açık doküman sayfasına , benim dava olduğuna inanıyoruz 16) y < nullptrnerede, 0olduğu nullptr.

Ama ne yapar?


1
X64'te, çekirdek aralığındaki kanonik işaretçilerin üst bit kümesine sahip olduğu gerçeğine dayanarak, bir işaretçinin çekirdek alanına ait olup olmadığını kontrol etmek için (aptal bir sabit kodlu) yol olabilir - aşağıdaki cevap doğruysa, o zaman hayır .
Michael Chourdakis

1
WINAPI'de p==-1geçersiz bir tanıtıcı. Yana 2^64bir ridicolously büyük sayıdır herhangi mantıklı pher zaman pozitiftir. Yani p<0WINAPI'nin geçersiz tanıtıcısını kontrol eder. Bu iyi bir kod değil.
ALX23z

@OP: Bu kodun hangi bağlamda kullanıldığını biraz açıklayabilir misiniz? Linux veya Windows üzerinde mi kullanılıyor? İşaretçinin değeri bazı WINAPI kodlarıyla ilişkili mi? Bunu açıkladıysanız, yukarıdaki yorumların iyi yanıtlar olabileceğini düşünüyorum.
Ceviz

@ ALX23z Peki bir WINAPI tanıtıcı türü uint8_t*(hatta dizisi uint8_t) olmalıdır? Bence onlar void*, değil mi?
Ceviz

@ ceviz HANDLE_PTR void*makro ya da temelde long*iirc olan bir şey değil.
ALX23z

Yanıtlar:


2

unique_ptr <0 VEYA operatörden daha az ne yapar?

Cppreference'deki aşırı yük (11) ile eşleşir operator<(const unique_ptr&, nullptr_t);. 0 dolaylı olarak dönüştürür std::nullptr_t. Belgelere göre sonuç std::less<unique_ptr<T,D>::pointer>()(x.get(), nullptr).

Sonuç, uygulama tanımlıdır, ancak muhtemelen çoğu sistemde koşulsuz olarak yanlıştır. Muhtemelen null değerinin 0 ikili gösterimine sahip olmadığı egzotik bir sistemde sonuç doğru olabilir.

Davamın 16 olduğuna inanıyorum)

(16), aynı başka bir yol ise: 0 > unique_ptr. Sonuç aynı.


Ancak derleyici tarafından 0dikkate nullptralınır? Bence bu merak ediyor. En azından benim için de bir anlamı yok.
alteredinstance

@alteredinstance 0 "dikkate alınmaz" nullptr(veya dikkate alarak ne demek istediğinize bağlıdır). 0 dolaylı olarak dönüştürür std::nullptr_t.
eerorika

Ben de öyle varsaydım. Zımni dönüşüm ile ilgili belgelendirme var olup olmadığını merak ediyorum 0için nullptrsadece boolean karşılaştırmalar ile uyumlu iki görmeyeli. Karşılaştırılabilirler, ancak dönüştürülebilir olmadıkları izlenimindeydim.
alteredinstance

@alteredinstance Dönüşüm başka bir şekilde gerçekleşmiyor. int x = nullptrkötü biçimlendirilmiş.
eerorika

2
@alteredinstance std::nullptr_therhangi bir boş gösterici sabiti ile kullanılabilecek şekilde tasarlanmıştır; sadece değil nullptr. 0 (örneğin 0L) null işaretçi sabitleridir, bu nedenle a oluşturmak için kullanılabilirler std::nullptr_t.
eerorika

2

operator <Kod tabanınızda bir yerde aşırı yüklenmediğini kontrol edin . Nasıl (p < 0)olabileceğinin tek yolu bu gibi görünüyor true.

Misal:

bool operator< (const std::unique_ptr<uint8_t[]>&, int) { return true; }

int main() {
    std::unique_ptr<uint8_t[]> p;
    std::cout << (p < 0) << std::endl;
}

Baskılar:

1

canlı demo

Aksi takdirde, diğerlerinin söylediği gibi, 0dolaylı olarak dönüşür std::nullptr_t, bu da dönecek olan bool operator<(const unique_ptr<T, D>& x, nullptr_t)aşırı yükü seçer (bir işaretçi değerine sahip Windows'da bile ).std::less(p, 0)false-1


O değil mutlaka dönecektir false. Uygulama tanımlı veya belirtilmemiş (emin değilim) Ama muhtemelen falseçoğu (tüm?) Uygulamalarda geri döneceğini kabul ediyorum . Ayrıca bkz. @Eerorika
ceviz

0

Bu ifade, bu şablon operatörü ile eşleşiyor (0 dönüştürülüyor nullptr):

template <class T, class D>
bool operator<(const unique_ptr<T, D>& x, nullptr_t);

Bu std::less<unique_ptr<T,D>::pointer>()(p.get(), nullptr)her zaman yanlış olanı döndürür ( std::lesskatı bir sipariş işlevi gibi ) ( demo ).


Her zaman geri dönmez false. Bu uygulamanın uygulama tanımlı mı yoksa belirtilmemiş mi olduğu. Muhtemelen falsemevcut uygulamaların çoğunda her zaman geri döner .
ceviz

@walnut Bir soru, Standardın ne dediği hakkında ( örneğin dil-avukat etiketi aracılığıyla) açıkça sormadığı sürece , pratik bir bakış açısıyla cevap vermeye çalışırım. std::lessGeri dönüşün tüm pratik uygulaması false.
YSC

Bu iyi, sadece nedenini (" std :: daha az katı bir sipariş işlevi " olarak) ikna edici bulamadım . Dönmeden sıkı bir sipariş olabilir false. Pratik neden, sıfır işaretçi değerinin mümkün olan en düşük adres veya bu satırlar boyunca bir şeyle temsil edilmesidir.
ceviz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.