代码之家  ›  专栏  ›  技术社区  ›  Ajay yadav

在C++11中,我们应该何时使用括号()和初始值设定项{}语法来初始化对象?[副本]

  •  15
  • Ajay yadav  · 技术社区  · 10 年前

    已更新

    我已经浏览了链接(例如 When to use the brace-enclosed initializer? )关于我应该什么时候使用 {} 大括号初始化,但没有给出何时使用括号的信息 ( ) vs.初始值设定项 { } 在C++11/14中初始化对象的语法?建议使用哪些标准做法 () 结束 {} ?

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

    2 回复  |  直到 9 年前
        1
  •  12
  •   Tristan Brindle    10 年前

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

    没有一种方法比另一种方法更好的共识,所以我的建议是选择一种方法并坚持使用。

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

        2
  •  10
  •   smasher    5 年前

    恭喜你,你刚刚找到了一个典型的例子,说明如果你的编译器支持的话,为什么你应该选择支持的初始化。

    如果你想 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::矢量 被添加到C++98中的语言中,而直到C++11才添加支撑初始化。

    请参见 Core C++ Guidelines 明确地 ES.23: Prefer the {} initializer syntax