2011-11-14 18 views
20

Istream nesnesinin neden bool ifadesi olarak kullanılabileceğini bilen var mı? Örneğin: ifstream nesnesine bir başvuru verir input >> iValue BuradaNeden komut nesnesi bir bool ifadesi olarak kullanılabilir?

ifstream input("tmp"); 
int iValue; 
while (input >> iValue) 
    //do something; 

. Bu nesnenin neden bool ifadesi olarak kullanıldığını bilmek istiyorum.
Ben lfStream sınıfa bakmak ve bu şu üye işlevine bağlı olabilir bulmak:

operator void * () const; 

bu işlevi hakkında ayrıntılar için here bakınız.
Öyleyse, bu işlevi bana açıklayan var mı? Bu işlevin prototipi, normal operatör aşırı yük beyanından farklıdır. Bu işlevin dönüş tipi nedir?
Değilse, o zaman, ifstream nesnesinin bool ifadesi olarak kullanılmasının nedeni nedir?
Yardımlarınız için bekliyorum!

Cheng

+0

Eh yalındır cevap olmasına rağmen soru soruldu. –

+0

C++ 11'den bu yana aslında 'open bool() ' –

cevap

20

Bir istream'in boole ifadesi olarak kullanılmasını sağlayan tam mekanizma, C++ 11'de değiştirildi. Daha önce bulduğunuz gibi, void* için örtük bir dönüşüm yapıldı. C++ 11'de, bool'a bir explicit dönüşümüdür.

bir boolean ifadede bir istream veya ostream ait

Kullanımı etkinleştirilmiş C++ programcıları bir while veya for döngünün koşul olarak yan etkilerinden ile bir ifade kullanmaya devam edebilmesi için:

SomeType v; 

while(stream >> v) 
{ 
    // ... 
} 

Ve programcıların bunu yapmasının ve bunu istemesinin nedeni, daha kısa bir kod vermesidir. Ve hellip; Bununla birlikte, bazı durumlarda bu tür bir ayrıntılı yapının bile tercih edilebilir olması mümkündür. Değişir.

Şerefe & hth.,

5

O verilen türe döküm operatörü. operator T(), T türünde bir operatördür. if deyiminde, ifstream, void*'a dönüştürülür ve void*, bool'a dönüştürülür.

+4

' void * bool'üne dönüştürülür. Bu doğru değil. Aksine, 'void * 0' ile karşılaştırılır. – iammilind

+0

Cevabınız için teşekkürler, anladım. Bir sorum daha var: eğer bir sınıfta iki oyuncu operatör işlevi varsa, biri int ve diğeri int *. Çağrı için (obj), hangi durumda operasyon fonksiyonu çağrılacak? Niye ya? Teşekkürler. – cheng

+4

@iammilind: Doğru. İşaretçi 'boole' dönüştürülür. §4.12 ve §6.4.1'i kontrol edin. –

İlgili konular