C++ 除了用值填充一些容器外,std::initializer\u list构造函数用于什么?

C++ 除了用值填充一些容器外,std::initializer\u list构造函数用于什么?,c++,c++11,constructor,initializer-list,C++,C++11,Constructor,Initializer List,标准库中有一个主要而明显的含义——“用元素列表初始化集合”: std::vector v={1,2,3}; 在下面std::bitset上的链接后面可以找到另一个含义——“单个值是从初始值设定项\列表的元素组合而成的” 标准库中的第三个示例是std::piecewise_constant_distribution,但我不太清楚它有什么语义,而不完全是元素集合 std::initializer\u list构造函数的其他用例是什么?如果可能的话,用真实代码的例子 这实际上是一个关于课堂设计的问题

标准库中有一个主要而明显的含义——“用元素列表初始化集合”:

std::vector v={1,2,3};
在下面std::bitset上的链接后面可以找到另一个含义——“单个值是从初始值设定项\列表的元素组合而成的”

标准库中的第三个示例是std::piecewise_constant_distribution,但我不太清楚它有什么语义,而不完全是元素集合

std::initializer\u list构造函数的其他用例是什么?如果可能的话,用真实代码的例子

这实际上是一个关于课堂设计的问题。
由于某些列表初始化操作可能会将std::initializer\u列表构造函数添加到现有类中,因此在编写新类时,您应该始终提前知道它是否需要std::initializer\u列表构造函数。
因此,我试图通过编写std::initializer\u list构造函数的用例来模拟看到未来的能力


主要的问题是:我如何确定我的类将来可能有(对用户来说并不奇怪)std::initializer\u list构造函数来编写正确的非std::initializer\u list构造函数呢?

我在当前的项目中实际使用了这种技术。我有一个类“BaseMenu”,它需要在构造函数中初始化std::vector,所以它的参数是std::vector。然后,我有一个从BaseMenu继承的MainMenu,我只是告诉BaseMenu我想要我的MainMenu是什么样子:

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

MainMenu::MainMenu():
    BaseMenu({{"Play"},
              {"Options"},
              {"About"},
              {"Quit"}})
BaseMenu(std::vector);
MainMenu::MainMenu():
基本菜单({“播放”},
{“选项”},
{“关于”},
{“退出”})
它真的很“舒服”。
PS:上面的模型被简化了,但它应该给人一种std::initializer\u list有用的感觉

我认为initializer\u 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*’ 
  • 它将初始化概念封装在一个类中
  • 此机制还提供类型安全性,并避免可能导致 信息丢失
  • Its提供了唯一的const_迭代器类型接口,因此可以对其进行读优化,并且任何主体都不能更新/写入它。这是有意义的,因为它意味着初始化另一个对象
  • 例如,您可能需要参考我的信息

    编辑

    std::initializer\u列表的可能优势

    //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*’ 
    
    //1。类中的初始化概念
    std::初始值设定项_列表x{1,2,3,4,5};
    向量v(x.begin(),x.end());
    //2.更好的类型安全性,避免狭窄的转换场景
    std::向量v{1,2,3.4,4};
    编译器输出
    正在缩小{}内“3.399999999999e+0”从“double”到“int”的转换范围
    //3. 提供常量迭代器类型接口
    std::初始值设定项_listly{1,2,3,4,5};
    自动itrs=ly.begin();
    int*x=itrs;
    编译器输出
    错误:从“常量int*”到“int*”的转换无效
    
    我的措辞(或英语)可能有些问题,因为您和用户3496846都回答了一些我没有回答的问题asked@user2665887:我想你想通过实例来了解Initializer_列表用例/优势。我已经用实例更新了我的帖子。希望你会发现它很有用。所有人都尊重你,但是你问了一个非常开放的问题,所以当你得到各种各样的答案时,这应该是毫不奇怪的!你最好的办法是在互联网上搜索例子,或者找到一个C++ 11的好的C++书籍。如果你问这样一个问题,很难预测你会得到什么答案。嗯,我对这个问题做了一些编辑,不确定它是否正确helps@user2665887当前位置我建议您查看标准库类并遵循相同的操作。一般来说,容器类型类应该有一个构造函数,可以使用初始值设定项列表(如数组、向量、列表、映射……)初始化该构造函数。对于非容器类型,不要编写这样的构造函数(iostream…)。这是标准中通常遵循的一般规则,所以我们也应该遵循同样的规则。