c++c++11constructor

Calling constructor with braces


Simple question about C++11 syntax. There is a sample code (reduced one from the importance of std::function):

struct Wanderer
{
  explicit Wanderer(std::vector<std::function<void (float)>> & update_loop)
  {
    update_loop.emplace_back([this](float dt) { update(dt); });
  }
  void update(float dt);
};

int main()
{
  std::vector<std::function<void (float)>> update_loop;
  Wanderer wanderer{update_loop}; // why {} ???
}

I'd like to know how it is possible to call the constructor with curly braces like Wanderer wanderer{update_loop};. It is neither an initializer list, nor uniform initialization. What is this?


Solution

  • It is neither initializer list, nor uniform initialization. What's the thing is this?

    Your premise is wrong. It is uniform initialization and, in Standardese terms, direct-brace-initialization.

    Unless a constructor accepting an std::initializer_list is present, using braces for constructing objects is equivalent to using parentheses.

    The advantage of using braces is that the syntax is immune to the Most Vexing Parse problem:

    struct Y { };
    
    struct X
    {
        X(Y) { }
    };
    
    // ...
    
    X x1(Y()); // MVP: Declares a function called x1 which returns
               // a value of type X and accepts a function that
               // takes no argument and returns a value of type Y.
    
    X x2{Y()}; // OK, constructs an object of type X called x2 and
               // provides a default-constructed temporary object 
               // of type Y in input to X's constructor.