什么是std :: initializer_list构造函数,除了用一些容器填充值?

时间:2014-04-08 17:10:49

标签: c++ c++11 constructor initializer-list

在标准库中找到一个主要而明显的含义 - "用一个元素列表初始化一个集合":

std::vector<int> v = {1, 2, 3};

另一个含义可以在下面std :: bitset的链接后面找到 - &#34;单个值是从initializer_list&#34;的元素组合而成的。

标准库中的第三个例子是std :: piecewise_constant_distribution,但我不愿意说它有什么语义,而不是一个元素的集合。

std :: initializer_list构造函数的其他用例是什么?如果可能,请使用实际代码中的示例。

这实际上是关于课堂设计的问题 由于列表初始化的一些pecularities将std :: initializer_list构造函数添加到已存在的类easily an surprisingly be a breaking change,所以在编写新类时,您应该事先知道它是否需要std: :initializer_list构造函数。
所以,我试图通过写出std :: initializer_list构造函数的用例来模拟查看未来的能力。

主要问题是:我如何确定我的类可能会在未来编写正确的非std :: initializer_list构造函数时使用std :: initializer_list构造函数(对于用户来说并不奇怪)?

2 个答案:

答案 0 :(得分:1)

我实际上在我当前的项目中使用这种技术。我有一个班级&#34; BaseMenu&#34;它需要在它的构造函数中初始化std :: vector,所以它有std :: vector作为它的参数。然后,我有继承BaseMenu的MainMenu,我告诉BaseMenu我想要的MainMenu是什么样的:

BaseMenu(std::vector<std::string>);

MainMenu::MainMenu():
    BaseMenu({{"Play"},
              {"Options"},
              {"About"},
              {"Quit"}})

真的很舒服&#34;。 PS:上面的模型是简化的,但它应该给出std :: initializer_list

的有用感

答案 1 :(得分:1)

我认为intializer_list具有以下主要功能:

  1. 它将初始化概念封装在一个类中。
  2. 此机制还提供类型安全性并避免可能导致的任何转换  信息丢失。
  3. 它提供了唯一的const_iterator类型接口,以便可以优化读取,并且任何主体都不应该能够更新/写入它。这有意义,因为它意味着初始化另一个对象。
  4. 对于实际示例,您可能需要参考我的blogISOCPP信息。

    修改

    std :: initializer_list

    的可能优点
    //1. Initialization Concept In A class
    std::initializer_list<int>  x{1,2,3,4,5};
    std::vector<int> v(x.begin(), x.end());
    
    
    
    
    //2.Better Type Safety and avoid narrow conversions scenario
     std::vector<int> v{1, 2, 3.4, 4};
    
     Compiler Output
    
     narrowing conversion of ‘3.3999999999999999e+0’ from ‘double’ to ‘int’ inside { }
    
    
    
    //3. Provide Const iterator type interface
    std::initializer_list<int> ly{1,2,3,4,5};
    auto itrs = ly.begin();
    int* x = itrs;
    
    Compiler Output
    
    error: invalid conversion from ‘const int*’ to ‘int*’