作者:做条温顺的鱼_169 | 来源:互联网 | 2022-11-30 18:14
1> NathanOliver..:
当你有
Test b{{2}};
[dcl.init.list] /3.7州.
否则,如果T是类类型,则考虑构造函数.枚举适用的构造函数,并通过重载决策([over.match],[over.match.list])选择最佳构造函数.[...]
并且在[over.match]中查看[over.match.ctor]/1
当类类型的对象被直接初始化时,从相同或派生类类型([dcl.init])的表达式进行复制初始化,或者默认初始化时,重载决策选择构造函数.对于不在复制初始化上下文中的直接初始化或默认初始化,候选函数是要初始化的对象的类的所有构造函数.对于复制初始化(包括复制初始化上下文中的默认初始化),候选函数是该类的所有转换构造函数([class.conv.ctor]).参数列表是初始化程序的表达式列表或赋值表达式.
所以我们考虑构造函数,找到
Test(const int a)
然后我们使用元素{2}
作为初始化器a
,使用[dcl.init.list] /3.9
否则,如果初始化程序列表具有E类型的单个元素且T不是引用类型或其引用类型与E引用相关,则从该元素初始化对象或引用(通过复制初始化复制列表 - 初始化,或直接初始化直接列表初始化); 如果需要缩小转换(见下文)将元素转换为T,则程序格式不正确.
同
Test c{{{3}}};
// and
Test d{{{{4}}}};
我们做同样的事情.我们看看构造函数并找到
Test(const int a)
作为唯一可行的.当我们尝试初始化时a
,我们再次查看[dcl.init.list] /3.9,但这里不适用.{{3}}
并且{{{4}}}
不是单一类型的初始化列表E
.一个支撑-初始化列表没有一个类型,所以我们必须继续前进列表[dcl.init.list/3.当我们这样做时,我们不会遇到任何匹配的东西,直到[dcl.init.list] /3.12
否则,该计划是不正确的.