2015-11-11 20 views
9

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?

+4

Bunların her biri farklı bir işaretçi türü kabul ve siz (herhangi bir nedenle) nullptr ile bunlardan birini aramak gerekiyor. – 101010

+7

getSomePtr() '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. –

+0

Önemli olan * tipidir *. İşaretçinin değeri, bir aletin geçerli olup olmadığını etkilemez. – molbdnilo

cevap

12

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.

+0

"Yedek" yi Tamam olarak tanımladınız mı? – emlai

+0

@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 :) –

0

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)) 
+0

'Offsetof' sorusuyla ne ilgisi var? Bunu eklemenin hiçbir şeyi açıklamayacağını düşünmüyorum. –

+0

Ö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. –

+0

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

7

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.

0

Ş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... 
} 
İlgili konular