2015-04-18 63 views
11

Bugün programımda küçük bir yazım hatası yaptım ve programın iyi bir şekilde derlenmiş olmasına rağmen neden hiç çıktı almadığımı merak ediyordum. Temel olarak bu kadar azaltır:Akış çıkışında <yerine <neden hala <çoğum?

#include <iostream> 

int main() 
{ 
    std::cout < "test"; // no << but < 
} 

ben program hala derler işte gerçekleştirilir örtük dönüşüm ne tür hiçbir fikrim yok (her iki gr ++ 4.9.2 ve hatta g ++ 5). Sadece clang ++ kodunu reddettiğini fark ettim. Gerçekleştirilen void*'a bir dönüşüm var mı (başka bir şey düşünemiyorum)? Böyle bir şey gördüğümü hatırlıyorum, ama g ++ 5'de ele alındığını düşündüm, ama durum böyle görünmüyor.

DÜZENLEME: -std=c++11 ile derleme değildi, böylece kod geçerli olduğu önceden C++ 11 (nedeniyle ostream arasında void* dönüşüm için). -std=c++11 ile derlerken g ++ 5 kodu reddeder, g ++ 4.9 hala kabul eder.

+2

Ancak '-Wall' kullanırken kullanılmayan bir hesaplanmış değer hakkında g ++ 4.9.2'den bir uyarı alıyorum. –

+0

@Raphael, derlediğim zaman, tüm uyarılara bakmadım, şimdi ne olduğunu anladım ve anladım, ama biraz sıra dışı olduğunu söylemeliyim. Çoğu zaman kullanıyorum -Wall', ancak bu, yüce metinde derlediğim ve sihirli bir şekilde çalıştığı küçük bir kod parçasıydı. – vsoftco

+0

Neden [bu] (http://coliru.stacked-crooked.com/a/ 667a9c3ad1ee9afe) 0 bir çıkış verir mi? – Destructor

cevap

9

Evet, derleyici bir void* için cout dönüştürmektedir.

mov edi, OFFSET FLAT:std::cout+8 
    call std::basic_ios<char, std::char_traits<char> >::operator void*() const 
    cmp rax, OFFSET FLAT:.LC0 
    setb al 
    test al, al 

operator void* suçlu açıklık getiriyor: Eğer kodun sökme almak için -S anahtarını kullanırsanız, böyle bir şey göreceksiniz.

Bill Lynch'in söylediklerinin aksine, numaralı telefondan —std=c++11 ile çoğaltıyorum. Bununla birlikte, C++ 11'in 'un operator bool ile basic_ios üzerinde değiştirilmiş olması gerektiğinden, bir uygulama hatası gibi görünmektedir.

+0

C++ 11'de 'std :: ostream' üzerinde bir işleç void *()' yoktur. Yani bu bir uygulama hatası olurdu. –

+0

Ben g ++ 4.9 bir kusur olduğunu düşünüyorum (g ++ 5 onu reddediyor) – vsoftco

+0

g ++ 4.9 ** değil ABI kırmak için bazı noktalarda tam olarak C++ 11 uyumlu değil. Bu şeylerden biri. g ++ 5 tamamen C++ 11 uyumlu olacaktır. –

5

Bu yalnızca C++ 11'den önce geçerlidir.

Temelde yapıyoruz: ((void *) std::cout) < ((char *) "test")

+0

üzgünüm, geri alıyorum, kullanmadım '-std = C++ 11' .... g ++ 5 bunu reddediyor, g ++ 4.9.2 bile, -std = c + ile değil + 11 '. – vsoftco

İlgili konular