Compile time Initialization of Data Structures
In C we are used to doing things like this:
struct { int a, b; } map_a2b = { {1, 2}, {2, 4}, {4, 8}};
To initialize complex data structures. However if you get clever and try to do it in C++ you get in trouble. A very simple case works:
class int_pair { public: int a, b; }; int_pair map_a2b[] = { {1, 2}, {2, 4}, {4, 8}};
However a seemingly trivial change breaks it:
class int_pair { public: int a, b; }; int_pair map_a2b[] = { {1, 2}, {2, 4}, {4, 8}};
This is because only "aggregate" types may be initialized with lists. Whats an aggregate you ask? According to the C++ standard:
An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or protected non-static data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).
The above is no longer an aggregate because it has a non-default constructor (sigh).
You might get clever and try to initialize something more complicated like a map:
std::map<int,int> a[] = { {1, 2}, {2, 4}, {4, 8}};
This wont work either, at least not in the current standard (C++98). C++11, whose features are slowly being rolled out in gcc will support this.