【发布时间】:2020-01-26 08:00:17
【问题描述】:
这个问题与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()。我认为这只是编译器优化是否正确?
我认为没有理由不在这里单独使用转换构造函数,除了我找不到任何描述这种行为的措辞。
【问题讨论】:
-
你说得对,如果重载决议选择了移动构造函数,我没有意识到这里需要实现一个临时的。对不起,我的错,删除了我的答案。我相信 StoryTeller 是对的。
标签: c++ initialization language-lawyer