这个问题与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,这也意味着复制省略。