这个问题是关于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。