Bunu yapabilir miyim?Nullptr'i diğer işaretçi türüne atayabilir miyim?
static_cast<A*>(getSomePtr());
getSomePtr()
nullptr
dönecektir nerede. Bu tamam?
Bunu yapabilir miyim?Nullptr'i diğer işaretçi türüne atayabilir miyim?
static_cast<A*>(getSomePtr());
getSomePtr()
nullptr
dönecektir nerede. Bu tamam?
Wikipedia article Gönderen:
... boş işaretçi sabiti:
nullptr
.nullptr_t
türünde olan, herhangi bir işaretçi türü veya işaretçi-üyesi türüne dolaysız olarak dönüştürülebilir ve karşılaştırılabilir. Bu,bool
hariç, dahili olarak dönüştürülebilir veya tümleşik türlerle karşılaştırılabilir değildir.
nullptr
yüzden static_cast
ile açık dönüşüm kesinlikle geçerli olan herhangi bir işaretçi türüne örtük olarak dönüştürülebilir olduğunu.
"Yedek" yi Tamam olarak tanımladınız mı? – emlai
@zenith Soruyu cevaplıyorum. 'GetSomePtr()' işlevi 'nullptr' döndürür, ancak bazen yardımcı olabilir. Bu bağlamda oyuncuların kullanımı tamam. (Cevap düzeltildi. Yine de teşekkürler :) –
Evet, bunu yapabilirsiniz. Hala boş olacak, bu yüzden üyelerine veya verilere erişme güvenli değil, ancak derleme zamanında yapısı hakkında sorular sorabilirsiniz.
Örneğin, bu nullptr geçerli bir tür atama edildiği <cstddef>
bir possible implementation of the offsetof(type, member)
function şöyledir:
#define offsetof(type,member) ((std::size_t) &((static_cast<type*>(nullptr))->member))
'Offsetof' sorusuyla ne ilgisi var? Bunu eklemenin hiçbir şeyi açıklamayacağını düşünmüyorum. –
Özgün soru "nullptr'i başka bir işaretçi türüne çevirebilir miyim" idi. 'Offsetof' örneği bunun yapılabileceğini ve bunun neden pratikte yapıldığını gösteriyor. –
Bu, başka bir şey olan 'type *' türünde bir rvalue nesne oluşturuyor. Belirli bir türün rengin işaretçisini oluştururken 'nullptr '' döküm 'nullptr' (boş bir işaretçi değil) için geçerli olan tek meşru nedendir. – emlai
null işaretçisi ve nullptr
arasındaki fark konusunda kafanız karıştığından şüpheleniyorum, bunlar aynı değil. bu türdeki bir nesne döndürmesi için iyi bir neden çok nadiren vardır,
std::nullptr_t getNullPtr() { return nullptr; }
Ama bu dönüş için oldukça yararsız bir şeydir:
Bu fonksiyon nullptr
döner.
Bu fonksiyon bir boş işaretçisi verir:
A* getAPtr() { return nullptr; }
dönüş değeri nullptr
ile başlatılır ama aslında tip A*
bir boş gösterici değil, nullptr
kendisidir.
İlk işlev için, evet, döndürülmüş std::nullptr_t
'u başka bir işaretçi türüne atayabilirsiniz (dönüştürmeyi yapmak için bir döküm aracına bile ihtiyacınız yoktur, örtük bir şekilde gerçekleşir) ancak bu muhtemelen yapmak istediğiniz bir şey değildir .
İkinci işlev için, onu doğru türden döndürdüğü için eklemeniz gerekmez.
Şimdiye kadar verilen cevaplara ek olarak, ancak sorunuzu biraz genelleştirerek (iade değerlerinin dökümü hakkında, diğer cevaplara bakın): Döküm nullptr
sadece geçerli olmakla kalmaz, aynı zamanda bir kaç durum söz konusudur. kaçınılmaz! Birkaç aşırı fonksiyonlar varsa Örneğin, ... nullptr` için ne `bulunuyor
void f(int*) { /*...*/ }
void f(double*) { /*...*/ }
void g()
{
f(nullptr); // compilation error, ambiguous call!
f(static_cast<int*>(nullptr)); // now compiler knows...
}
Bunların her biri farklı bir işaretçi türü kabul ve siz (herhangi bir nedenle)
nullptr
ile bunlardan birini aramak gerekiyor. – 101010getSomePtr() 'türünün dönüş tipi nedir?Aslında 'std :: nullptr_t' mü yoksa gerçek işaretçi türünün boş gösterici değeri mi? 'Std :: nullptr_t' işlevinden geri dönmek çok garip ve eğer std :: nullptr_t' değilse, o zaman 'nullptr' olmadığından onu yazmanız gerekmez. –
Önemli olan * tipidir *. İşaretçinin değeri, bir aletin geçerli olup olmadığını etkilemez. – molbdnilo