2016-09-07 18 views
8

Belki kimse beni bu açıklayabiliriz:Durumu operatörü ":?" Ve LPCTSTR fonksiyon başlığındaki

bool Func1(LPCTSTR sData) 
{ 
    if (sData) { ... } 
} 

Ve böyle fonksiyonu olarak adlandırılan:

CString str = _T(""); 
Func1((str.IsEmpty() ? NULL : str)); 

Ve 'SDATA' iç işlevini asla boş değil, her zaman boş dize ama NULL değil, neden? Böyle Eddited kodu: Doğru işler Bu durumda

LPCTSTR strNull = NULL; 
Func1((str.IsEmpty() ? strNull : str)); 

.

+0

'Func1; ':':' VS2015 üzerinde derleme değil, ben 'Hata C2446 olsun 'int' to 'CString' \t hiçbir dönüşüm ... –

cevap

5

Bu, hem ikinci hem de üçüncü işlenenleri ortak bir türe dönüştürme gereksiniminden kaynaklanır.
(sonuç koşul doğru olup olmadığını bağlı olarak farklı türleri içeremez.)

Birinci parametre dönüştürmek bir türü yok NULL beri

str.IsEmpty() ? CString(NULL) : str 

eşdeğerdir CString için.
Ve CString(NULL) boş bir CString oluşturur.

ikinci CString beri

str.IsEmpty() ? strNull : (LPCTSTR) str 

eşdeğerdir LPCTSTR dönüştürülebilen ama tersi değil yoludur. döküm satır içine almak

,

str.IsEmpty() ? (LPCTSTR) NULL : str 

ikinci olarak aynı etkiyi vermelidir. (? (Str.IsEmpty() NULL: str))

+0

Ve hala [CString] (https://msdn.microsoft.com/en-us/library/cws1zdt8.aspx) c'tor 'CString (NULL)' ifadesinde çözülür. İşaretçi argümanlarını alan birkaç kişi var. Derleyici nasıl bir tane seçer (ve hangisi)? – IInspectable

+0

Şimdi anladım: Tek bir işaretçi argümanı alan tüm c'tors 'const XCHAR *' alanın dışında 'explicit'. – IInspectable

1

İlk bakışta, ben

Func1((str.IsEmpty() ? (LPCTSTR)NULL : str)); 

da çalışmaya devam eder hayal ve eğer olursa, muhtemelen

LPCTSTR strNull = NULL; 

atama tarafından düzeltildi tip döküm sorun var o olacak çünkü strNull daha sonra çağrıldığında, LPCTSTR türünü null değeriyle ilişkilendirin.

5

Koşullu işleç, ikinci ve üçüncü bağımsız değişkenlerini, ikisi için ortak olan bir türe dönüştürür. CString'un ayrıntılarını bilmiyorum, bu yüzden bu sadece bir tahmindir, ancak koşullu işleç 'u üçüncü bağımsız değişkenin türüyle eşleştirmek için dönüştürür ve bu, LPCTSTR'a örtük bir dönüşüm aracılığıyla iletir. işlev.

+1

'CString', örtük bir dönüşüm işlecine sahiptir ([CSimpleStringT :: operator PCXSTR] (https://msdn.microsoft.com/en-us/library/tk1z2hd9.aspx)). Hala izlemiyorum, [CStringT :: CStringT] (https://msdn.microsoft.com/en-us/library/cws1zdt8.aspx) kurucusunun nasıl çözüldüğü. Bir 'NULL' işaretçisi ile eşleşen birden fazla var. – IInspectable