使用转换功能直接初始化

时间:2019-09-26 05:22:09

标签: c++ initialization language-lawyer

这个问题与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()。我是否正确地假设这只是编译器优化?

除了我找不到描述这种行为的措辞之外,我没有理由不只在这里使用转换构造函数。

1 个答案:

答案 0 :(得分:1)

基本上所有上述编译器都在进行并在CWG Issue 2327中实现指令。您是正确的,当前没有措辞允许您观察到这种行为。但正如问题所指出的,如果有的话,那真的很好。

但是,要准确地解决这个问题是很棘手的,因此问题仍然处于“起草”阶段。但是编译器可以并且确实实现了复制省略。.