这个问题和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()。我假设这只是编译器优化,对吗?
我认为没有理由不在这里单独使用转换构造函数,除了我找不到任何描述这种行为的措辞之外。
发布于 2019-09-26 15:17:32
它本质上就是前面提到的所有编译器在CWG Issue 2327中实现的方向。你说得对,目前还没有允许你观察到的行为的措辞。但正如这期杂志指出的那样,如果有的话,那就太好了。
然而,在它的确切位置上来是很棘手的,所以这个问题仍然处于“起草”阶段。但是编译器可以而且确实实现了复制省略..
https://stackoverflow.com/questions/58110041
复制相似问题