İster kasıtlı olarak ister kazayla, <<
muhtemelen kastettiğiniz yerde ilk çıktı satırının sonuna sahipsiniz ;
. Yani esasen sahipsin
cout << "2+3 = "; // this, of course, prints "2+3 = "
cout << cout; // this prints "1"
cout << 2 + 3; // this prints "5"
cout << endl; // this finishes the line
Öyleyse soru şuna indirgeniyor: neden cout << cout;
yazdırılıyor "1"
?
Bu, belki de şaşırtıcı bir şekilde ince görünüyor. std::cout
, Taban sınıfı ile std::basic_ios
, içerir , belirli bir tür dönüşüm operatörü olduğu gibi, boolean bağlamında kullanılmak üzere tasarlanmıştır
while (cout) { PrintSomething(cout); }
Çıktının başarısız olması zor olduğu için bu oldukça zayıf bir örnektir - ancak std::basic_ios
aslında hem giriş hem de çıkış akışları için temel bir sınıftır ve girdi için çok daha mantıklıdır:
int value;
while (cin >> value) { DoSomethingWith(value); }
(akışın sonunda veya akım karakterleri geçerli bir tam sayı oluşturmadığında döngüden çıkar).
Şimdi, bu dönüştürme operatörünün kesin tanımı, standardın C ++ 03 ve C ++ 11 sürümleri arasında değişti. Eski sürümlerde, operator void*() const;
(genellikle olarak uygulanır return fail() ? NULL : this;
), daha yeni sürümlerde explicit operator bool() const;
(genellikle basitçe uygulanır return !fail();
). Her iki bildirim de boole bağlamında iyi çalışır, ancak bu tür bağlamın dışında (yanlış) kullanıldığında farklı davranır.
Özellikle, C ++ 03 kuralları altında, bir adres cout << cout
olarak yorumlanacak cout << cout.operator void*()
ve bir adres yazdırılacaktır. C ++ 11 kurallarına göre, cout << cout
operatör bildirildiği explicit
ve dolayısıyla örtük dönüştürmelere katılamayacağı için hiç derlenmemelidir . Aslında değişimin birincil motivasyonu buydu - anlamsız kodların derlenmesini engellemek. Her iki standarda da uyan bir derleyici, yazdıran bir program üretmez "1"
.
Görünüşe göre, bazı C ++ uygulamaları, derleyici ve kitaplığı uygun olmayan sonuç üretecek şekilde karıştırmaya ve eşleştirmeye izin veriyor (@StephanLechner'dan alıntı: "xcode'da 1 üreten bir ayar ve bir adres veren başka bir ayar buldum: Dil lehçesi "Standart kitaplık libc ++ (c ++ 11 destekli LLVM standart kitaplığı)" ile birleştirilen c ++ 98 1 verirken, libstdc (gnu c ++ standart kitaplığı) ile birleştirilen c ++ 98 bir adres verir; "). explicit
Dönüşüm operatörlerini (C ++ 11'de yenidir) anlamayan ve dönüşümü operator bool()
. Böyle bir karışımla, basitçe ve baskı cout << cout
olarak yorumlanmak mümkün hale gelir .cout << cout.operator bool()
cout << true
"1"
;
İlk çıktı satırının sonunda noktalı virgül olmasını istiyorsunuz , değil<<
. Yazdırdığınızı düşündüğünüz şeyi yazdırmıyorsunuz. Yapıyorsuncout << cout
, hangi baskıları1
kullanıyor (cout.operator bool()
sanırım). Sonra5
(kimden2+3
) hemen onu takip ederek on beş rakamı gibi görünür.