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.