更新
我已经浏览了链接(例如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个元素?
答案 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