The important thing about initialization list is that members are not initialized in order of their appearance in initialization list but in order of declaration in class.
C++ Standard n3337 § 12.6.2/10 Initializing bases and members
In a non-delegating constructor, initialization proceeds in the
  following order:
— First, and only for the constructor of the most derived class (1.8),
  virtual base classes are initialized in the order they appear on a
  depth-first left-to-right traversal of the directed acyclic graph of
  base classes, where “left-to-right” is the order of appearance of the
  base classes in the derived class base-specifier-list.
— Then, direct base classes are initialized in declaration order as
  they appear in the base-specifier-list (regardless of the order of the
  mem-initializers).
— Then, non-static data members are initialized in the order they were
  declared in the class definition (again regardless of the order of the
  mem-initializers).
— Finally, the compound-statement of the constructor body is executed.
[ Note: The declaration order is mandated to ensure that base and
  member subobjects are destroyed in the reverse order of
  initialization. — end note ]
( now I will repeat my other answer but I think this won't hurt anyone) This is important. Remember this to avoid errors like 
/* trying to allocate (possibly) very large block of memory
   as a result of initializing a vector with
   uninitialized integer: std::vector<int> v( N)
*/
class SearchEngine {
    std::vector<int> v;
    int N;
    explicit SearchEngine( std::vector<int> const& keys)
                  : N( keys.size()), v( N), {