当参数转换为目标类型时,复制构造函数省略项以进行直接初始化

时间:2019-01-21 20:46:33

标签: c++ initialization language-lawyer c++17 copy-elision

这个问题与c ++标准的措辞有关。

所有编译器,我认为应该是这样,取消复制构造函数以初始化对象let a = BigInt(99999n) console.log(a.length) // yield undefined ,下面的对象{assembly here

b

但是当我阅读标准时,我不明白为什么会发生这种省略(粗体)[dcl.init]/17.6.2

  

否则,如果初始化为直接初始化,则考虑构造函数。   枚举适用的构造函数([over.match.ctor]),并通过重载分辨率([over.match])选择最佳的构造函数。   如此选择的构造函数称为,以初始化程序表达式或表达式列表作为其参数来初始化对象。   如果没有适用的构造函数,或者重载解决方案不明确,则初始化格式不正确。

专门说构造函数被调用。但是没有编译器会这样做。

我想我缺少某些内容或无法正确阅读标准。我应该如何阅读标准?


这与标准的前几款和后几款形成鲜明对比,后者专门规定了复制省略[dcl.init]/17.6.1

  

如果初始化程序表达式是prvalue,并且源类型的cv不合格版本与目标程序的类相同,则初始化程序表达式用于初始化目标对象。< / p>

和[dlc.init] /17.6.3:

  

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

最后一句话将我带回到[dcl.init] /17.6.1,这也意味着复制省略。

1 个答案:

答案 0 :(得分:1)

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