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!
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ę. –
, którego kompilator Pre C++ 11 wypróbowałeś? – TemplateRex
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