C++自定义拷贝构造时移动构造显式delete与不声明的差异问题
C++移动构造行为差异问题解答
问题1解答
- 省略移动构造声明时,
A b(std::move(a))确实会直接调用拷贝构造,完全符合C++标准。 - 逻辑和普通函数重载规则完全一致:当类没有声明移动构造函数时,重载决议的候选列表中根本不存在移动构造这一选项。
std::move(a)得到的右值可以合法绑定到const A&类型的形参,因此会匹配到拷贝构造函数。
问题2解答
- 两种情况的核心差异是:显式delete移动构造是「函数存在,但被标记为不可用」;不声明移动构造是「函数根本不存在,不会进入重载候选列表」。
- 当你显式delete移动构造时,这个函数会进入重载候选集,右值参数优先匹配
A&&类型的形参,重载决议会选中这个被删除的函数,直接触发编译报错。 - 当你不声明移动构造时,由于你已经自定义了拷贝构造函数,编译器不会隐式生成默认移动构造,重载候选列表里没有移动构造这一项,决议会向后匹配到可以接受右值的拷贝构造函数,因此正常执行拷贝逻辑。
内容的提问来源于stack exchange,提问作者QnA
相关产品推荐
相关产品推荐

