将参数转换为目标类型时直接初始化的复制构造函数省略 这个问题是关于C++标准的措辞。

将参数转换为目标类型时直接初始化的复制构造函数省略 这个问题是关于C++标准的措辞。,c++,initialization,language-lawyer,c++17,copy-elision,C++,Initialization,Language Lawyer,C++17,Copy Elision,所有的编译器,我认为这就是应该的,省略复制构造函数来初始化对象bbellow(): 但当我阅读该标准时,我不明白为什么会出现这种省略(粗体): 否则,如果初始化是直接初始化,[…],则会考虑构造函数。 将枚举适用的构造函数([over.match.ctor]),并通过重载解析([over.match])选择最佳构造函数。 这样选择的构造函数被调用以初始化对象,并将初始值设定项表达式或表达式列表作为其参数。 如果没有应用构造函数,或者重载解析不明确,则初始化是错误的 特别地说,构造函数被调用。但没

所有的编译器,我认为这就是应该的,省略复制构造函数来初始化对象
b
bellow():

但当我阅读该标准时,我不明白为什么会出现这种省略(粗体):

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

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

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


这与本标准前几段和后几段中明确要求省略副本的内容形成了对比:

如果初始值设定项表达式是prvalue,并且源类型的cv非限定版本与目标类型的类相同,初始值设定项表达式用于初始化目标对象

和[dlc.init]/17.6.3:

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


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

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

似乎相当于@Jarod42的示例,我认为本页上的所有示例都与[dcl.init]匹配/17.6.1而不是让我感到不安的第17.6.2段。您希望编译器将
a
对象转换为临时
B
对象,然后在构建
B
期间将该临时对象复制到
B
?它使用
b
存储
a
转换为
b
@1201程序的返回值这是我在标准中读到的。根据我的阅读,省略不应该发生。
struct B;

struct A{
    operator B();
};

struct B{
    B(const B&);
    B(B&&);
};

void test(A a){
    B b(a);
}