2014-09-03 13 views
5

To naprawdę nie jest jasne, dlaczego ktokolwiek nazwałby konkretną formę inicjalizacji "inicjowania wartości". Brzmi to tak, jakby zainicjował obiekt, nadając mu wartość ... ale to właśnie robi inicjalizacja, a nazwa nie mówi nic o wartości, której będzie używać do inicjowania.Dlaczego inicjalizacja wartości jest tak nazwana?

+0

Termin pojawia się po raz pierwszy w [N1191] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1999/n1191.pdf). –

+5

Być może to fakt, że faktycznie * robi * zawsze daje jakąś sensowną wartość. Domyślna inicjalizacja często nie działa. – chris

Odpowiedz

7

The Boost value_init write-up zapewnić dość szczegółową historię wartości inicjalizacji skończyło się w normie od defect report 178: More on value-initialization i wydaje się, że termin pochodzi od defect report 35: Definition of default-initialization. Chociaż żaden z tych dokumentów naprawdę zapewnić prawidłowe pochodzenie na metę ma dostarczyć kilka dobrych pomysłów, to mówi:

Pierwszy Sprostowanie techniczne dla C++ Standard (TC1), którego projekt został przekazany do wiadomości publicznej w W listopadzie 2001 r. Wprowadzono Core Issue 178 (wśród wielu innych kwestii, oczywiście).

Ta kwestia wprowadziła nową koncepcję inicjowania wartości (również poprawiono sformułowanie dla inicjalizacji zerowej). Nieformalna inicjalizacja wartości jest podobna do inicjowania domyślnego z wyjątkiem , że w niektórych przypadkach nie-statyczne elementy danych i sub-obiekty klasy podstawowej są również inicjowane wartością. Różnica polega na tym, że obiekt , który jest zainicjowany wartością, nie będzie miał (lub przynajmniej będzie mniejszy niż ) nieokreślonych wartości dla elementów danych i sub-obiektów klasy bazowej ; w przeciwieństwie do konstruowania domyślnego obiektu. (zob. Wydanie podstawowe 178 w celu uzyskania opisu normatywnego).

Aby określić wartość inicjalizacji obiektu, należy użyć inicjalizatora zestawu pustego:().

i wartość inicjalizacji jest mniej prawdopodobne, aby opuścić obiekt o wartości nieokreślonej kontra default-initalization.

+0

OT, ale ta zmiana wprowadziła denerwujący problem; dla POD struct 'T foo = T();' i podobne instrukcje miały tylko "pracę" w C++ 03, więc w przenośnym kodzie nie mogłeś tego robić bez ryzyka, że ​​byłby uruchomiony na Kompilator C++ 98 i cicho powodują straszny UB. –

+0

@MattMcNabb, co jest niefortunne, czy istnieje raport o usterce? –

+0

Nie jestem tego świadomy, to była tylko nowa rzecz dodana w TC1 –

Powiązane problemy