将参数转换为目标类型时,复制用于直接初始化的构造函数省略



这个问题是关于c++标准的措辞。

所有编译器,我认为这就是应该的,都省略了用于初始化对象b的复制构造函数(此处为汇编):

struct B;
struct A{
operator B();
};
struct B{
B(const B&);
B(B&&);
};
void test(A a){
B b(a);
}

但当我阅读该标准时,我不明白为什么会出现这种省略(我的粗体)[dcl.init]/17.6.2:

否则,如果初始化是直接初始化,[…],则考虑构造函数。枚举适用的构造函数([over.match.ctor]),并通过重载解析([over.match])选择最佳构造函数。这样选择的构造函数被调用以初始化对象,初始值设定项表达式或表达式列表作为其参数。如果没有应用构造函数,或者重载解析不明确,则初始化格式不正确。

有人特别说调用了构造函数。但没有编译器能做到这一点。

我想我错过了什么,或者没有正确阅读标准。我应该如何阅读标准


这与标准的前一段和下一段形成了对比,这些段落特别要求复制省略[dcl.init]/17.6.1:

如果初始值设定项表达式是一个prvalue,并且源类型的cv不合格版本与目标的类是同一类,则初始值设定项表达式用于初始化目标对象

和[dlc.init]/17.6.3:

否则(即,对于剩余的副本初始化情况),可以从源类型转换为目标类型的用户定义转换[…]调用所选函数时,将初始值设定项表达式作为其参数;[…]调用用于直接初始化,根据上面的规则,作为复制初始化目标的对象。

最后一句话把我送回[dcl.init]/17.6.1,这也意味着省略了副本。

@T。C.在评论中回答说,这是核心语言问题CWG2327。

最新更新