代码之家  ›  专栏  ›  技术社区  ›  Khaled Alshaya

C++(+0)中的统一初始化,何时使用()代替{}?

  •  12
  • Khaled Alshaya  · 技术社区  · 16 年前

    什么时候用老一套的语法来决定 () {} ?

    初始化结构:

    struct myclass
    {
        myclass(int px, int py) : x(px), y(py) {}
    private:
        int x, y;
    };
    ...
    myclass object{0, 0};
    

    现在在一个 vector 例如,它有许多构造函数。每当我做以下事情时:

    vector<double> numbers{10};
    

    我得到一个向量 1 10 作为构造器之一的元素是:

    explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
    

    我怀疑当一个类定义 initializer list 构造函数在向量的情况下,使用 {}

    所以,我的想法是正确的。即 我是否应该仅在类定义初始值设定项列表构造函数以调用其他构造函数时才恢复到旧语法? e、 g.纠正上述代码:

    vector<double> numbers(10); // 10 elements instead of just one element with value=10
    
    2 回复  |  直到 16 年前
        1
  •  10
  •   Community Mohan Dere    5 年前

    我在标准文件里找到了答案( latest draft ). 希望我能解释一下我所理解的。

    首先,如果一个类定义了一个初始化列表构造函数,那么只要合适,就可以使用它:

    §8.5.4(第203页)

    初始值设定项列表构造函数是 优先于其他施工人员

    我认为这是一个很好的功能,消除了头痛与 不均匀 样式:)

    无论如何,唯一的问题(我的问题是关于)是,如果你设计一个没有初始化构造函数的类,然后你添加它以后你可能会得到令人惊讶的结果。

    基本上,想象一下 std::vector 如果没有初始值设定项列表构造函数,则以下将创建一个包含10个元素的向量:

    std::vector<int> numbers{10};
    

    通过添加初始值设定项列表构造函数,编译器会因为 {} 语法。由于init列表的元素 {10} 使用init list构造函数接受。如果没有可接受的转换,则应使用任何其他构造函数,例如:

    std::vector<string> vec{10};
    // a vector of 10 elements.
    // the usual constructor got used because "{0}"
    // is not accepted as an init-list of type string.
    
        2
  •  2
  •   Tim Sylvester    16 年前

    看看这个:

    http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=453&rll=1

    {} -变量上的样式初始值设定项没有直接映射到类的任何构造函数上的初始化列表。可以添加/删除/修改这些构造函数初始化列表,而无需中断现有的调用者。

    基本上,容器的不同行为是特殊的,并且需要该容器中的特殊代码,特别是采用 std::initializer_list . 对于POD和简单对象,可以使用 {} () 可以互换。