Masquue Asked: 2024-11-13 19:32:31 +0800 CST2024-11-13 19:32:31 +0800 CST 2024-11-13 19:32:31 +0800 CST 类类型的直接初始化是否考虑用户定义的转换函数? 772 据我了解,第16.6.2a条适用于仅考虑A构造函数的直接初始化。 但代码编译得很好。 我遗漏了哪部分导致用户定义的转换函数也被考虑? struct A {}; struct B { operator A(); }; void f() { A a(B{}); } c++ 1 个回答 Voted Best Answer user17732522 2024-11-13T19:38:58+08:002024-11-13T19:38:58+08:00 A具有隐式移动和隐式复制构造函数,它们均采用引用A,并且这些参数中的引用可以通过调用中的转换运算符来初始化B。 最后,重载解析将选择隐式移动构造函数。 话虽如此,这会导致不必要的移动构造,A而编译器不允许省略这种构造。开放的CWG 问题 2327考虑消除这个不必要的临时对象,以便转换函数可以直接初始化该对象,并且一些编译器已经以某种类似的形式处理它(违反了当前标准中的规范)。
A
具有隐式移动和隐式复制构造函数,它们均采用引用A
,并且这些参数中的引用可以通过调用中的转换运算符来初始化B
。最后,重载解析将选择隐式移动构造函数。
话虽如此,这会导致不必要的移动构造,
A
而编译器不允许省略这种构造。开放的CWG 问题 2327考虑消除这个不必要的临时对象,以便转换函数可以直接初始化该对象,并且一些编译器已经以某种类似的形式处理它(违反了当前标准中的规范)。