我们什么时候应该使用括号()与初始化{}语法来初始化C++ 11中的对象?

Aja*_*dav 8 c++ initialization c++11 c++14

更新

我已经通过链接(例如何时使用大括号括起来的初始化程序?)何时应该使用{}大括号初始化,但是当我们应该使用括号( )与初始化{ }语法来初始化C++中的对象时,没有给出信息./ 14?什么标准的做法,建议使用(){}

在极少数情况下,例如vector<int> v(10,20);auto v = vector<int>(10,20);,结果是std::vector10个元素.如果我们使用大括号,结果是std::vector2个元素.但这取决于调用者的用例:要么他/她想要分配10个元素的矢量还是2个元素?

Chu*_*urn 9

恭喜,您刚刚找到了一个规范示例,说明如果您的编译器支持,您应该更喜欢花括号初始化的原因。

如果你想要std::vector两个元素中的一个,你可以使用:

vector<int> v = { 10, 20 };
Run Code Online (Sandbox Code Playgroud)

如果您使用,vector<int> v(10,20);您实际上是在调用带有两个整数可转换元素的构造函数,explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());请记住,它std::vector是在 C++98 中添加到语言中的,而花括号初始化直到 C++11 才被添加。

请参阅核心 C++ 指南,特别是ES.23:首选 {} 初始值设定项语法

  • 为什么这是一个为什么一个人应该*喜欢*一个而不是另一个的例子?对我来说,它看起来更像是一个你实际上没有选择的例子。 (8认同)

Tri*_*dle 9

Scott Meyers在其出色的"Effective Modern C++"的第7项中解决了这个问题.他贯穿了两种语法的差异,优点和缺点,并得出结论

没有人认为任何一种方法都比另一方更好,所以我的建议是选择一种方法并始终如一地应用它.

另一方面,C++核心指南建议你更喜欢初始化语法,所以也许这是更好的默认设置.

  • 就个人而言,我倾向于同意Meyers,但我还必须在很多情况下编写代码,这些代码必须使用不支持{}初始化列表的旧版Visual C++构建.就像``auto``一样,它往往不仅仅是一个判断问题,它改进了哪些模糊的可读性.尽管如此,如果您对C++完全陌生,根据核心指南,您可能更安全地使用{}初始化程序的规则. (3认同)