据我了解,子句16.6.2适用于
a
的直接初始化,它只考虑A
的构造函数。
但是代码编译得很好。
我缺少哪一部分导致用户定义的转换函数也被考虑?
struct A {};
struct B {
operator A();
};
void f()
{
A a(B{});
}
A
有一个隐式移动和一个隐式复制构造函数,它们都引用A
,并且这些参数中的引用可以通过调用B
中的转换运算符来初始化。
最终,重载决策将选择隐式移动构造函数。
话虽这么说,这会导致
A
上不必要的移动构造,编译器不允许忽略它。开放的CWG问题2327考虑消除这个不必要的临时对象,以便转换函数可以直接初始化该对象,并且一些编译器已经以某种类似的形式处理它(违反当前标准中的规范)。