C++ 使用转换函数直接初始化

C++ 使用转换函数直接初始化,c++,initialization,language-lawyer,C++,Initialization,Language Lawyer,这个问题几乎与我在实现中注意到的问题相同 考虑以下几点: struct A { A(); A(A&&); }; struct B { operator A(); }; void f() { B b; A a(b); } 我对标准的理解是,因为这种直接初始化(源和目标类型不同)只考虑构造函数。选择构造函数A(A&&),并将参数绑定到转换函数的结果,总共生成两个调用:运算符A(),A(A&&),这是此处唯一适用的子子句 但是,这不是gcc、msvc和clang或icc所显

这个问题几乎与我在实现中注意到的问题相同

考虑以下几点:

struct A { A(); A(A&&); };

struct B { operator A(); };

void f() 
{
 B b;
 A a(b);
}
我对标准的理解是,因为这种直接初始化(源和目标类型不同)只考虑构造函数。选择构造函数A(A&&),并将参数绑定到转换函数的结果,总共生成两个调用:
运算符A()
A(A&&)
,这是此处唯一适用的子子句

但是,这不是gcc、msvc和clang或icc所显示的行为,它们都说只调用
操作符A()。假设这只是编译器优化,对吗


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

基本上是前面提到的所有编译器都在继续并实现中的方向。您是正确的,目前没有允许您观察行为的措辞。但正如问题所指出的,如果真的有,那就太好了


然而,确切地说这是一个棘手的问题,因此这个问题仍处于“起草”阶段。但是编译器可以而且确实实现了复制省略。

你说得对,我没有意识到,如果通过重载解析选择了移动构造函数,那么在这里需要具体化临时构造函数。对不起,我的错,删除了我的答案。我相信讲故事的人是对的。在GCC中,这似乎反映在这里:。