关于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};
那样,用花括号调用构造函数,它既不是初始化列表,也不是统一初始化,这是什么东西?
3条答案
按热度按时间yqlxgs2m1#
它既不是初始化器列表,也不是统一初始化。这是什么东西?
你的前提是错误的,它是统一初始化,用标准术语来说,就是 direct-brace-initialization。
除非存在接受
std::initializer_list
的构造函数,否则使用大括号构造对象等效于使用圆括号。使用大括号的优点是语法不受Most Vexing Parse问题的影响:
dpiehjr42#
这只是C++11语法。你可以用花括号初始化对象的构造函数。你只需要记住如果类型有initializer_list构造函数,那么那个构造函数优先。
g0czyy6m3#
此外,大括号构造函数不允许收缩,类似于大括号初始化。
让我们看一下这个简单的构造函数如何获取和打印一个整数值:
当
Test test(3.14);
编译并输出缩小的3
时,Test test{3.14};
甚至无法编译: