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.
Jaka jest relacja z initializer_lists? To tylko kopia niezainicjowanej zmiennej. –
co znaczy c {c}? –
Ponieważ c nie jest "A *", oznacza to kopię. –