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

时间:2016-02-09 07:08:57

标签: c++ c++11 initialization c++14

更新

我已经浏览了链接(例如When to use the brace-enclosed initializer?)何时应该使用{}大括号初始化,但是我们何时应该使用括号( )与初始化程序时没有给出信息{ }语法初始化C ++ 11/14中的对象?有哪些标准做法建议使用()而不是{}

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

2 个答案:

答案 0 :(得分:8)

Scott Meyers在他的精彩“有效的现代C ++”的第7项中解决了这个问题。他完成了两种语法的差异,优点和缺点,并得出结论

  

没有达成共识,任何一种方法都比另一种方法更好,所以我的建议是选择一种并一致地应用它。

另一方面,C ++核心指南建议你prefer the initialiser syntax,所以也许这是更好的默认设置。

答案 1 :(得分:3)

恭喜,您刚刚发布了一个典型示例,说明如果您的编译器支持,您应该更喜欢支持初始化。

如果您需要std::vector两个元素,请使用:

vector<int> v = { 10, 20 };

如果你使用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之前,braced-initialization没有被添加。

请参阅Core C++ Guidelines,特别是ES.23: Prefer the {} initializer syntax