繁体   English   中英

initializer_list,构造函数和初始化初始化

[英]initializer_list, constructors and braced initialization

在阅读有关不同类型的初始化,我偶然发现的众多怪异的交互的一个std::initializer_list (以前的帖子在这里 )。 这显然是一个简单的主题,这是C ++书籍中介绍std::vector的第一个主题。

关键是,如果您有一个采用(仅我猜) std::initializer_list构造std::initializer_list ,则在进行std::initializer_list时将强烈建议使用该构造函数:换句话说, std::vector<int> NewVect{5, 10}将创建一个包含5和10的对象,而不是初始化为10的5个元素( std::vector<int> NewVect(5, 10) )。

auto括号初始化会发生特殊行为( auto A={1,2,3}会被推导为std::initializer_list<int> )。 现在,我不敢相信C ++会为特定的对象提供特殊的处理方式,因为据我所知,标头只是写得很好且有用的代码段。 而且,即使您不直接或间接#include <initializer_list> ,这些语法也不起作用,即使我的编译器VS2017会打印出一组非常特殊的错误,指出需要该标头才能工作(您可以轻松测试这与auto )。

所以,我的问题是,这是理所当然的,这是初始化列表标题中代码的作用,而我的编译器可能是假定使用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而构建的,它是如何实现的?

标准中有一条特殊的规则,其内容大致如下: “如果您使用列表初始化( {...} )来构造对象,并且该对象具有采用std::initializer_list的构造std::initializer_list ,则无论重载分辨率如何 ,都选择构造函数” 这意味着在使用{...}初始化语法时, std::initializer_list构造函数始终比其他构造函数具有优先级。


我能否将这种行为重新路由到除显式调用之外再也不会发生

在您的类中,可以避免使用std::initializer_list 那么这种行为将永远不会发生。 您不能为std::类更改此设置。


可以将这种行为赋予其他用户创建的类吗?

不符合您期望的语法,因为std::initializer_list很特殊。 您可以创建自己的initializer_list替代方案,或使用可变参数模板构造函数之类的方法来强制用户使用显式语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM