使用转换函数直接初始化

Direct initialization with conversion functions

本文关键字:初始化 函数 转换      更新时间:2023-10-16

这个问题几乎与直接初始化中的转换运算符相同,但是,这是我在实现中注意到的。

请考虑以下事项:

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 第 2327 期中的方向。您是正确的,目前没有措辞允许您观察到的行为。但正如问题所指出的那样,如果有的话,那就太好了。

然而,确切的答案是很棘手的,所以这个问题仍处于"起草"阶段。但是编译器可以并且确实实现了复制省略。