从CPP参考上的列表初始化:
否则,将分两个阶段考虑T的构造函数:
将所有以std :: initializer_list作为唯一参数,或将第一个参数(如果其余参数具有默认值)作为第一个参数的构造函数进行检查,并通过重载分辨率与std :: initializer_list类型的单个参数进行匹配
如果前一个阶段不产生匹配,则T的所有构造函数都将针对由braced-init-list元素组成的参数集参与重载解析,并且限制为仅允许非缩小转换。如果此阶段生成一个显式构造函数作为复制列表初始化的最佳匹配,则编译会失败(请注意,在简单的复制初始化中,根本不考虑显式构造函数)
因此,initializer_list
首先考虑使用构造函数。如果失败,则将列表的每个元素视为构造函数的参数。然而
#include <iostream>
using namespace std;
struct A{
template <typename... Args> A(Args... li) { cout << sizeof...(Args) << endl;}
};
int main(){
A a = {2,3,4};
}
输出为3
,表示Args...
解压缩为int, int, int
。为什么Args ...不是简单地initializer_list<int>
设为单数,列表初始化指示的细节将是构造函数的第一种尝试类型?
[temp.deduct.call] / 1模板参数推导是通过将每个函数模板参数类型(称为
P
)与调用的相应参数类型(称为A
)进行比较,如下所述。如果删除的引用和cv修饰符从P
给出std::initializer_list<P'>
一些P'
和参数为初始化值列表(8.5.4),然后进行扣除,而不是用于初始化列表中的每个元素,以P'
作为函数模板参数类型和初始值设定元素作为其论据。否则,使用初始值设定项列表参数会导致该参数被视为非推论上下文(14.8.2.5)。
强调我的。因此,initializer_list<int>
无法从类型的参数推导出构造函数的模板参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句