这个问题与直接初始化中的Conversion运算符几乎相同,但是,这与我在实现中注意到的东西有关。
考虑以下:
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是将适用于这里的唯一子子句。
但是,这不是gcc,msvc和clang或icc显示的行为,它们都说仅operator A()
被调用。我是否正确地假设这只是编译器优化?
除了我找不到描述此行为的任何措辞的事实外,我没有理由不只在这里使用转换构造函数。
基本上所有上述编译器都在进行并在CWG Issue 2327中实现该方向。您是正确的,当前没有措辞允许您观察到这种行为。但是,正如问题所指出的那样,如果有的话,那真的很好。
但是,要对其进行准确的处理是很棘手的,因此问题仍然处于“起草”阶段。但是编译器可以并且确实实现了复制省略。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句