使用转换函数直接初始化

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" 阶段。但是编译器可以并且确实实现了复制省略..