使用转换函数直接初始化
Direct initialization with conversion functions
这个问题几乎与 相同,但是,这是我在实现中注意到的一些问题。
考虑以下因素:
struct A { A(); A(A&&); };
struct B { operator A(); };
void f()
{
B b;
A a(b);
}
我对标准的解读是,由于这种直接初始化,源类型和目标类型不同,所以只考虑构造函数。选择构造函数A(A&&),将参数绑定到转换函数的结果,一共产生两次调用:operator A()
、A(A&&)
,因为[dcl.init]/17.6.2.1是唯一的sub此处适用的条款。
然而,这不是 gcc、msvc 和 clang 或 icc 显示的行为,它们都说只调用了 operator A()
。我认为这只是编译器优化是否正确?
我认为没有理由不单独在这里使用转换构造函数,除了我找不到任何描述此行为的措辞。
基本上所有上述编译器都在继续并实现 CWG Issue 2327 中的方向。你是对的,目前没有允许你观察到的行为的措辞。但正如问题所指出的那样,如果有的话,那就太好了。
然而,要准确描述它是很棘手的,所以问题仍处于 "drafting" 阶段。但是编译器可以并且确实实现了复制省略..
这个问题几乎与
考虑以下因素:
struct A { A(); A(A&&); };
struct B { operator A(); };
void f()
{
B b;
A a(b);
}
我对标准的解读是,由于这种直接初始化,源类型和目标类型不同,所以只考虑构造函数。选择构造函数A(A&&),将参数绑定到转换函数的结果,一共产生两次调用:operator A()
、A(A&&)
,因为[dcl.init]/17.6.2.1是唯一的sub此处适用的条款。
然而,这不是 gcc、msvc 和 clang 或 icc 显示的行为,它们都说只调用了 operator A()
。我认为这只是编译器优化是否正确?
我认为没有理由不单独在这里使用转换构造函数,除了我找不到任何描述此行为的措辞。
基本上所有上述编译器都在继续并实现 CWG Issue 2327 中的方向。你是对的,目前没有允许你观察到的行为的措辞。但正如问题所指出的那样,如果有的话,那就太好了。
然而,要准确描述它是很棘手的,所以问题仍处于 "drafting" 阶段。但是编译器可以并且确实实现了复制省略..