【发布时间】:2015-11-26 22:52:30
【问题描述】:
来自CPP reference 列表初始化:
否则,将分两个阶段考虑 T 的构造函数:
所有将 std::initializer_list 作为唯一参数或作为第一个参数(如果其余参数具有默认值)的构造函数都经过检查,并通过重载决议与 std::initializer_list 类型的单个参数进行匹配
如果前一阶段没有产生匹配,则 T 的所有构造函数都参与重载决议,以针对由括号初始化列表的元素组成的参数集,限制只允许非缩小转换.如果此阶段生成显式构造函数作为复制列表初始化的最佳匹配,则编译失败(注意,在简单复制初始化中,根本不考虑显式构造函数)
所以首先考虑使用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>,列表初始化的细节表明这是第一个尝试的构造函数类型?
【问题讨论】:
标签: c++ templates c++11 initializer-list variadic