用花括号调用构造函数

问题描述 投票:10回答:2

有关C ++ 11语法的简单问题。有一个示例代码(从source中减少了一个)

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

我想知道,怎么可能用Wanderer wanderer{update_loop};这样的大括号来调用构造函数,它既不是初始化列表,也不是统一的初始化。这是什么东西?

c++ c++11 constructor
2个回答
16
投票

既不是初始化列表,也不是统一初始化。这是什么东西?

您的前提是错误的。它是统一的初始化,用标准术语来说是直接括号初始化

除非存在接受std::initializer_list的构造函数,否则使用大括号构造对象等同于使用括号。

使用花括号的优点是语法不受Most Vexing Parse问题的影响:

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.

3
投票

这只是C ++ 11语法。您可以使用花括号初始化调用其构造函数的对象。您只需要记住,如果该类型具有initializer_list构造函数,则该构造函数优先。

© www.soinside.com 2019 - 2024. All rights reserved.