Pozdrowienia i hth. - Alf napisał w tym numerze answer, że inicjalizacja wartości jest prawdopodobnie nową cechą C++ 03 w porównaniu z C++ 98. Zastanawiam się, co miał na myśli.Czy inicjalizacja wartości jest częścią standardu C++ 98? Jeśli nie, dlaczego został dodany w standardzie C++ 03?
Czy value initialization jest częścią C++ 98? Czy jest obecny w koncepcji, ale nie w nazwie? Dlaczego został dodany do standardu C++ 03?
Mam kopię standardu '03, ale nie '98. Oto definicja domyślnej inicjalizacji i inicjowania wartości.
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 -formowane, jeśli 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 (klauzula 9) z konstruktora użytkownika zadeklarowana (12,1), a następnie konstruktor domyślny dla T nazywamy (i inicjalizacja jest źle sformułowana, jeśli T nie ma dostępnego domyślnego konstruktora);
- jeśli T jest nie do związków klasy typu bez konstruktora dla deklarowanej, wówczas każdy niż statyczna składowa element danych i baza klasy T ma wartość inicjowany;
- jeśli T jest typ tablicy, to każdy element jest inicjowany wartością;
- inaczej, obiekt jest zero-zainicjowany
Domyślam się, że '98 miał domyślną inicjalizacji ale nie inicjalizacji wartości i że istnieje jakaś zasadnicza różnica między tymi dwoma. Szczerze mówiąc mam problem z analizą standardese tutaj i nie rozumiem różnicy między definicjami.
Masz to. Proponuję, aby niektóre z racjonalnych przesłanek z DR skierowane były na odpowiedź, aby była zamknięta. Daj mi znać, kiedy to zrobisz, abym mógł cię pochwalić. :) –
Denerwujące w stosunku do wersji C++ 98 jest to, że jeśli posiadasz klasę zawierającą zmienne 'std :: string' i niektóre' int', nie ma możliwości, aby ją zera zainicjować ints inne niż jawnie wymień je wszystkie na liście inicjalizatora konstruktora. –
@MattMcNabb Nie podążałem. Wymień je wszystkie na liście inicjalizującej, a nie co? Jeśli nie umieścisz ich na liście inicjalizacyjnej w C++ 03, to są one zerowane? – Praxeolitic