nie wiem co uzasadnieniem wokół zmian (lub jak standard był wcześniej), ale jak to jest w zasadzie default-inicjalizacji jest albo wywołanie użytkownika zdefiniowanego konstruktora albo nic nie robi (dużo hand-falowanie tutaj: jest to rekursywnie stosowane do każdego podobiektu, co oznacza, że podobiekty z domyślnym konstruktorem zostaną zainicjowane, podobiekty bez konstruktorów zdefiniowanych przez użytkownika pozostaną niezainicjowane).
Jest to opisane w §8.5 Inicjatory i nawigacja nie jest banalna. Definicje zerowej inicjalizacji, default-zainicjować i wartości zainicjować są 5th ustęp:
zero-zainicjować obiekt typu T oznacza:
- jeśli T jest typ skalarny (3.9), obiekt jest ustawiony na wartość 0 (zero) konwertowany na T;
- jeśli T jest typem klasy niezłączonym, każdy niestatyczny element danych i każdy obiekt podrzędny klasy podstawowej jest zerowany;
- jeżeli T jest typem związku, pierwszy nazwany element danych89) jest inicjowany od zera;
- jeśli T jest typem tablicy, każdy element jest inicjowany od zera;
- jeżeli T jest typem referencyjnym, inicjalizacja nie jest wykonywana.
do wartości domyślnych zainicjować obiekt typu T oznacza
- jeśli T jest nie-POD klasy typu (punkt 9), konstruktor domyślną T nazywa (i inicjalizacji źle tworzy czy T nie ma dostępnego domyślnego konstruktora);
- jeśli T jest typem tablicy, każdy element jest domyślnie inicjowany;
- w przeciwnym razie obiekt jest inicjowany od zera.
Do wartości zainicjować obiekt typu T oznacza:
- jeśli T jest typem klasy (pkt 9) z konstruktora użytkownika zadeklarowana (12,1), a następnie konstruktor domyślny dla T nazywa (i inicjalizacja jest źle sformułowana, jeśli T nie ma dostępnego domyślnego konstruktora);
- jeśli T jest klasą niepowiązaną bez konstruktora deklarowanego przez użytkownika, wówczas każdy niestatyczny element danych i składnik bazowy T jest zainicjowany wartością;
- jeśli T jest typem tablicy, to każdy element jest inicjowany wartością;
- w przeciwnym razie obiekt jest zero-zainicjowany
Program, który wzywa do domyślnej-inicjalizacji lub od wartości inicjalizacji jednostki typu odniesienia illformed. Jeśli T jest typem kwalifikowanym cv, to wersja T bez cv jest używana dla definicji zeroinitializacji, inicjalizacji domyślnej i inicjalizacji wartości.
Odpowiednią częścią nowego standardu C++ 11 jest 8.5 ("Inicjatory") klauzule 5,6,7. –
Może daje ludziom opcję użycia domyślnego ctor, czy nie. W starej wersji C++ nawiasy były zwykle pomijane, gdy nie było żadnych parametrów. Zatem posiadanie nawiasów w nowej opcji wpłynie na mniejszy kod starszy. – QuentinUK
Nie nazwałbym tego zmianą, ale raczej poprawką. Ma to przynajmniej sens w kontekście np. std :: map gdzie wartości utworzone przez [] są zinicjalizowane, np. std :: map wszystkie U * są inicjowane do 0 –
PlasmaHH