在阅读有关不同类型的初始化,我偶然发现的众多怪异的交互的一个std::initializer_list(以前的帖子在这里).这显然是一个简单的主题,是C++书籍中首次出现的主题之一std::vector.
关键是,如果你有一个构造函数接受(我猜只有)std::initializer_list,当你对大小写进行初始化时,这个构造函数将是强烈优先的:换句话说,std::vector<int> NewVect{5, 10}将创建一个包含5和10的对象,而不是5元素初始化为10(std::vector<int> NewVect(5, 10)) .
auto大括号初始化auto A={1,2,3}会发生特殊行为(将被推断为a std::initializer_list<int>).现在,我无法相信C++对特定对象的特定处理,因为据我所知,标题只是编写良好且有用的代码片段.此外,如果你没有直接或间接地,那些语法不起作用#include <initializer_list>,即使我的编译器VS2017打印了一组非常特殊的错误,指出它需要该标头才能工作(你可以轻松地测试它auto).
所以,我的问题是,理所当然地认为这种行为是来自initiliazer列表标题的代码的影响,而我的编译器可能是为了假设使用STD而构建的,它是如何实现的?我是否可以将此行为重新路由,除了显式调用之外永远不会发生(也就是说,std::vector<int> NewVect{5, 10}相当于std::vector<int> NewVect(5, 10)你现在需要调用std::vector<int> NewVect{std::initializer_list<int>{5, 10}})?是否可以将此行为提供给其他用户构建的类?
理所当然地认为这种行为是来自initiliazer列表标题的代码的影响而我的编译器可能是为了假设使用STD而构建的,它是如何实现的?
标准中有一条特殊的规则,它说的是:"如果你使用list-initialization({...})来构造一个对象,并且该对象有一个构造函数std::initializer_list,那么无论过载分辨率如何,都会选择该构造函数".这意味着std::initializer_list在使用{...}初始化语法时,构造函数始终优先于其他构造函数.
我可以改变这种行为,除了显式调用之外永远不会发生
在您的课程中,您可以避免使用std::initializer_list.然后这种行为永远不会发生.您不能为std::课程更改此内容.
是否可以将此行为提供给其他用户构建的类?
没有你想要的语法,std::initializer_list特别是.您可以创建自己的initializer_list替代方法,或者使用类似于可变参数模板构造函数的方法来强制用户使用明确的语法.
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |