类类型直接初始化是否考虑用户定义的转换函数?

问题描述 投票:0回答:1

据我了解,子句16.6.2适用于

a
的直接初始化,它只考虑
A
的构造函数。

但是代码编译得很好。

我缺少哪一部分导致用户定义的转换函数也被考虑?

struct A {};
struct B {
    operator A();
};

void f()
{
    A a(B{});
}
c++ language-lawyer c++20
1个回答
0
投票

A
有一个隐式移动和一个隐式复制构造函数,它们都引用
A
,并且这些参数中的引用可以通过调用
B
中的转换运算符来初始化。

最终,重载决策将选择隐式移动构造函数。

话虽这么说,这会导致

A
上不必要的移动构造,编译器不允许忽略它。开放的CWG问题2327考虑消除这个不必要的临时对象,以便转换函数可以直接初始化该对象,并且一些编译器已经以某种类似的形式处理它(违反当前标准中的规范)。

© www.soinside.com 2019 - 2024. All rights reserved.