这个问题与Conversion operator in direct-initialization几乎相同,但是,这与我在实现中注意到的事情有关。
请考虑以下内容:
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()
。我是否正确地假设这只是编译器优化?
除了我找不到描述这种行为的措辞之外,我没有理由不只在这里使用转换构造函数。
答案 0 :(得分:1)
基本上所有上述编译器都在进行并在CWG Issue 2327中实现指令。您是正确的,当前没有措辞允许您观察到这种行为。但正如问题所指出的,如果有的话,那真的很好。
但是,要准确地解决这个问题是很棘手的,因此问题仍然处于“起草”阶段。但是编译器可以并且确实实现了复制省略。.