2015-03-11 17 views
51

Aşağıdaki örnek kodu vardır:Neden clang ++ sadece bir foo nesnesini yok eder?

I çınlama ++ -std = C++ 11 test.cc ile derlemek
#include <iostream> 
using namespace std; 

struct foo { 
    foo() { cout << "foo constructed.\n"; } 
    ~foo() { cout << "foo destroyed.\n"; } 
}; 

struct bar { 
    bar(foo t=foo{}) { } 
}; 

int main(int argc, char **argv) { 
    bar X[2]{}; 
    return 0; 
} 

, program aşağıdaki çıktı üretir:

foo constructed. 
foo constructed. 
foo destroyed. 

ama beklenen ek bir "foo yok etti." iki "foo inşası" arasında. çizgiler. Neden sadece bir foo yok edildi? Bu argo 3.5.1 yanı sıra 3.6.0 ile olur.

+3

GCC 4.9 çıkışları foo yapılandırılmıştır. foo yok edildi. foo inşa edildi. foo destroyed.' Clang 3.5 ve 3.6 sonuçlarınızı yeniden üretir. Sanırım argoda bir hata var (clang ile libstdC++ kullanarak hatalı sonuçları hala üretiyor, bu yüzden onun standart bir kütüphane sorunu olduğunu düşünmüyorum). – Cornstalks

+1

"\ n" yerine "endl" yi deneyin. – emlai

+0

Clang'ın hangi sürümü? Neden kimse @ ~! #ing versiyon numarasını yazmıyor? –

cevap

7

Test eden herkese teşekkürler! Bu, argoda bir böcek gibi görünüyor. Birisi bunu llvm.org'a bildirirse memnun olurum. Birkaç hatamın bildirdiğine göre, gerçekten yardımcı olmadı, bu yüzden bu deneyimi tekrarlamak istemiyorum.

+14

Bitti https://llvm.org/bugs/show_bug.cgi?id=22877 (asan ve valgrind ile gösterilen bir bellek sızıntısına dönüştürmek dahil) –

+1

Bu soruları büyüleyici buluyorum Öyle görünüyor ki varsayılan argümanlar ile tüm büyük derleyiciler ile bir tür '{}' başlatıcı sorunu olmuştur. Örneğin, [std :: GCC'de varsayılan argüman segfaults için boş brace-başlatıcıları ile harita argümanı] (http://stackoverflow.com/q/28837142/1708801) ve VC12'deki [(Bilinen) derleyici hatası] konusuna bakın. //stackoverflow.com/q/21044488/1708801). –

+0

@shafik düşüncelerim tam olarak. Bu kesin sorun geçen sene gcc'de çıktı! http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 60367 – boycy