Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用大括号调用构造函数_C++_C++11_Constructor - Fatal编程技术网

C++ 用大括号调用构造函数

C++ 用大括号调用构造函数,c++,c++11,constructor,C++,C++11,Constructor,关于C++11语法的简单问题。有一个示例代码(从中减少一个) struct漫游器 { 显式漫游器(std::vector&update\u循环) { update_loop.emplace_back([this](float dt){update(dt);}); } 无效更新(浮动dt); }; int main() { std::向量更新_循环; 流浪者流浪者{update_loop};//为什么{}??? } 我想知道,怎样才能调用带有花括号的构造函数,比如loverter{update_

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

struct漫游器
{
显式漫游器(std::vector&update\u循环)
{
update_loop.emplace_back([this](float dt){update(dt);});
}
无效更新(浮动dt);
};
int main()
{
std::向量更新_循环;
流浪者流浪者{update_loop};//为什么{}???
}
我想知道,怎样才能调用带有花括号的构造函数,比如
loverter{update_loop}它既不是初始值设定项列表,也不是统一初始化。这是怎么回事

它既不是初始值设定项列表,也不是统一初始化。这是怎么回事

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


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

使用大括号的优点是语法不受问题的影响:


这只是C++11语法。可以使用大括号初始化调用构造函数的对象。您只需记住,如果类型具有初始值设定项列表构造函数,则该构造函数优先。

但它是统一初始化。大括号可以用来调用构造函数,不过使用该类型的
std::initializer\u list
的构造函数总是首选。
//为什么{}??
——问得好。在某些情况下,它可以避免最麻烦的解析。@juanchopanza:但在其他情况下,它可以一次无声地更改代码的含义。我不喜欢“统一”初始化。@当然,这是一个非常丑陋的初始化功能。“除非存在接受std::initializer_列表的构造函数,…”如果存在这样的构造函数?
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 {} ???
}
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.