列表初始化中的最差转换序列

时间:2016-01-31 12:56:11

标签: c++ c++11 type-conversion overloading c++14

我不了解在重载决策期间如何对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,因为转换函数是不同的。

0 个答案:

没有答案