2013-01-09 20 views
10

w C i C++, można zainicjować za pomocą tablic i konstrukcjom szelki:Inicjowanie skalary z szelkami

int a[] = {2, 3, 5, 7}; 
entry e = {"answer", 42}; 

Jednak w a talk from 2007 Bjarne wspomina, że ​​składnia ta działa również dla skalarów. Próbowałem:

int i = {7}; 

I rzeczywiście działa! Jakie jest uzasadnienie umożliwiające inicjalizację skalarów za pomocą nawiasów klamrowych?

Uwaga: Jestem konkretnie nie mówi o jednolitej inicjalizacji C++ 11. To jest dobre stare C89 i C++ 98.

+1

To tylko część gramatyki języka C++. Umożliwienie inicjalizacji wszystkich obiektów w ten sposób jest bardziej spójne i prawdopodobnie upraszcza implementację. –

+0

, którego kompilator Pre C++ 11 wypróbowałeś? – TemplateRex

+0

Podobny temat: [Nawiasy wokół literału ciągu znaków w deklaracji tablicy znaków są poprawne?] (Http://stackoverflow.com/questions/10147264/braces-around-string-literal-in-char-array-declaration-valid-eg-char -s) – Nawaz

Odpowiedz

4

Jakie są przesłanki pozwalające na inicjalizację skalarów za pomocą nawiasów klamrowych?

int jest POD. Inicjalizacja nawiasów klamrowych jest dozwolona w przypadku int (i wszystkich typów wbudowanych), ponieważ powoduje, że inicjalizacja - składnia jest zgodna z innymi kodami POD.

Co więcej, domyślam się, że niezależnie od tego, czy racjonalna nazwa za jednolitą składnią inicjalizacji C++ 11 jest (częściowo) stosowana do tej składni dozwolonej przez C++ 03. To jest po prostu C++ 03 nie rozszerzyło tego o typy inne niż pod, takie jak standardowe kontenery.

Widzę jedno miejsce, w którym inicjalizacja jest pomocna w C++ 03.

template<typename T> 
void f() 
{ 
    T obj = { size() } ; //T is POD: built-in type or pod-struct 
    //code 
} 

Teraz to może być tworzony z struct który rozpoczyna się z odpowiednim członka, jak również wszelkiego rodzaju arytmetycznej:

struct header 
{ 
    size_t size; //it is the first member 
    //... 
}; 

f<header>(); //body becomes : header obj = { size(); }; which is fine 
f<size_t>(); //body becomes : size_t obj = { size(); }; which is fine 

Zauważ też, że POD, czy struct lub wbudowanych typów, może również być inicjowane jednolicie jako:

header h = header(); //value-initialized 
int i = int(); //value-initialized 

Więc wierzę jeden powodem jest to konsekwencja!

3

Uzasadnieniem nie wspomina się, ale z 2005 C++ Standard draft, 8,5 inicjatorów [dcl.init], 14.

Jeżeli T jest typu skalarne, to zgłoszenie formy T x = { a }; jest równoważna T x = a;

Zauważmy, że C++ 98 standard umożliwia tylko inicjatorów usztywnień dla kopiowaniem inicjalizacji T x = { a }, a nie do bezpośredniego inicjalizacji T x { a }, dla których tylko T x(a) prace.

UPDATE: patrz również ten question

1

C++ prawdopodobnie odziedziczył to od C. W C głównym powodem jest to, aby mieć unikalny składni initilizer, w szczególności dla domyślnej inicjatora. W C domyślnym inicjatorem jest {0}.