c++ Ctor mit geschweiften Klammern aufrufen




c++ initializer list array (2)

Es ist nur C ++ 11 Syntax. Sie können Objekte, die ihren Konstruktor aufrufen, mit geschweiften Klammern initialisieren. Sie müssen nur bedenken, dass, wenn der Typ einen Konstruktor initializer_list hat, dieser Vorrang hat.

Einfache Frage zu C ++ 11 Syntax. Es gibt einen Beispielcode (von der Quelle reduziert)

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 {} ???
}

Ich würde gerne wissen, wie es möglich ist, Aufrufkonstruktor mit geschweiften Klammern wie Wanderer wanderer{update_loop}; Es ist weder Initialisierungsliste noch einheitliche Initialisierung. Was ist das für eine Sache?


Answer #1

Es ist weder Initialisierungsliste noch einheitliche Initialisierung. Was ist das für eine Sache?

Deine Prämisse ist falsch. Es ist eine einheitliche Initialisierung und, in Standardsprache, direkte Klammerinitialisierung .

Wenn kein Konstruktor vorhanden ist, der eine std::initializer_list akzeptiert, ist die Verwendung von geschweiften Klammern zum Konstruieren von Objekten äquivalent zur Verwendung von Klammern.

Der Vorteil der Verwendung geschweifter Klammern besteht darin, dass die Syntax immun gegen das Most-Vexing-Parse- Problem ist:

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.




constructor