2013-06-27 17 views
5

Update2:brak ostrzeżenia kompilatora z nieprawidłowym nawiasów inicjatora

Jak podejrzewał, nie mają do czynienia z mającą konstruktora listy inicjator. Z komentarzem R. Martinho Fernandes jest oczywiste, że to jest po prostu stara się skonstruować obiektu z kopią sobie, że nie jest wykrywany przy użyciu składni nawiasów:

struct C{ 
    C(){} 
}; 
struct D{ 
    C c0{c0}; // << -- compiles without warning 
    C c1(c1); // << -- does not compile 
}; 

Pozostaje pytanie. Czy diagnostyka jest wymagana przez standard dla tego przypadku? Zdaję sobie sprawę, że diagnostyka nie jest możliwa ani praktyczna dla wszystkich rodzajów błędów.

Skończyło się to zgłaszanie jako błąd 57758.

Oryginalne pytanie:

Ktoś wiem dobrze udało się napisać błędny kod (spowodowanego czystej pomyłki), które ostatecznie generowane fałszywe bad_alloc wyjątki. Zastanawiam się, czy istnieje dobry powód, dla którego gcc (4.7.2 i 4.8.1) nie ostrzega o tym.

Czy diagnostyka jest wymagana przez standard dla tego przypadku? Zdaję sobie sprawę, że diagnostyka nie jest możliwa ani praktyczna dla wszystkich rodzajów błędów.

To, co sprowadza się do:

#include <initializer_list> 
struct A{}; 
struct C{ 
    C(std::initializer_list<A*> as){} 
}; 
struct D{ 
    C c{c}; // <<- well... 
};  
int main(){ 
    D d; 
} 

EDIT: Dlatego wspominam initializer_list jest to, że jeśli usunąć konstruktora listy inicjator zrobić pojawia się błąd: error: too many initializers for ‘C’

co moim zdaniem jest spowodowane faktem, że ponieważ nie ma zdefiniowanego przez użytkownika (deklarowanego przez użytkownika) konstruktora, otrzymuję inicjację agregacji, która nie działa, ponieważ nie ma elementu (typu C) w C.

+1

Jaka jest relacja z initializer_lists? To tylko kopia niezainicjowanej zmiennej. –

+0

co znaczy c {c}? –

+0

Ponieważ c nie jest "A *", oznacza to kopię. –

Odpowiedz

1

Clang ++ ma takie samo zachowanie . Przekazujesz wartość c0, gdy nie jest ona zainicjowana w domyślnym konstruktorze kopiowania, bez otrzymywania ostrzeżenia "niezainicjowane, gdy jest używane tutaj". (Napisz prywatny konstruktor kopii, aby potwierdzić.)

Myślę, że to, co się dzieje, to direct-list-initialization. Nie wiem, czy standard wymaga diagnostyki, ale warto zgłosić zgłoszenie błędu.

Powiązane problemy