我不了解在重载决策期间如何对initializer_list的最差转换序列进行排序。例如:
#include <initializer_list>
void fnc (std::initializer_list<int>){}
void fnc (std::initializer_list<long>){}
struct CL1 {
operator short(){return 1;} };
struct CL2 {
operator short(){return 1;} };
int main() {
CL1 cl1;
CL2 cl2;
fnc ({cl1, cl2});
}
这是一个重载fnc函数的调用,重载决策找到了最可行的函数。候选者是2个函数,通过比较他们所需的转换序列进行排名。
标准(n4296)13.3.3.1.5 / 4 [over.ics.list]说:
否则,如果参数类型是std :: initializer_list和all 初始化列表的元素可以隐式转换为X ,. 隐式转换序列是必需的最差转换 将列表的元素转换为X
对于std::initializer_list<int>
两次转换(CL1 - &gt; int,CL2 - &gt; int)都无法区分,两者都可能是最差的转换(用户定义的转化+促销)。模拟std::initializer_list<long>
,但转换顺序最差为用户定义的转换+标准转换。然后是主要问题:哪个转换(对于cl1或cl2)被选为最差?假设在两个初始化列表中,最差转换被选为第一个(对于cl1)。然后,根据13.3.3.2/3.3 [over.ics.rank]
用户定义的转换序列U1是更好的转换序列 比另一个用户定义的转换序列U2,如果它们包含 相同的用户定义转换函数或构造函数或它们 在聚合初始化和其中任何一个中初始化相同的类 情况下,U1的第二个标准转换序列优于 U2的第二个标准转换序列。
int的情况更好,因为它的第二个标准转换序列更好(针对标准转换的提升),并且两个转换都包含相同的运算符short()。然后假设对于std::initializer_list<long>
最差转换是针对第二个元素(cl2),并且这里是ambuguity,因为转换函数是不同的。