无法转换初始值设定项列表的第二个参数

Cannot convert the second argument of the initializer-list

本文关键字:列表 第二个 参数 转换      更新时间:2023-10-16

标准说:(N3797::13.3.3.1/4 [over.best.ics]

但是,当考虑构造函数或 用户定义的转换函数,在 13.3.1.3 中是候选函数,当 在第二步中为复制/移动临时而调用 类复制初始化,传递初始值设定项时由 13.3.1.7 列表作为单个参数或当初始值设定项列表只有一个参数时 元素和对某些类X或引用的转换(可能 CV 合格)X考虑用于构造函数的第一个参数 X,[...]只考虑标准转换序列和省略号转换序列。

也就是说,我们只在以下情况下关注第一个参数:

#include <iostream>
struct B;
struct C
{
    C(){ }
    C(const B&){ }
};
struct B
{ 
    B(){ }
    B(const C&){ }
};
struct A
{
    A(const C&, const C&){ }
    A(const B&){ }
};
B b;
C c;
A a{b, b};

int main(){ }

演示

它有效,尽管我提供了b作为第一个参数,并且不应应用用户定义的转换B-->C

您有一个从BA的转换,以及从CB的转换,但您正在尝试从{B,C}构造一个A,并且没有该形式的构造函数。

但是现在你已经完全放弃了它。 :)