显式删除移动赋值运算符后重载解析异常的C++标准依据问询
问题解析
核心原因:你显式声明并删除的operator=(foo&&)不属于C++20 12.4.1.8条款描述的「被定义为删除的默认移动特殊成员函数」,因此它仍会参与重载决议,最终因匹配优先级更高被选中导致编译错误。
具体执行流程
- 执行
f = 1时,编译器通过foo(int)构造临时foo右值对象。 - 重载决议阶段,两个候选运算符进入候选集:
operator=(const foo&):临时右值可绑定到const左值引用,合法但匹配优先级较低。operator=(foo&&):直接匹配右值引用,匹配优先级更高。
- 由于该移动赋值是显式删除的用户声明函数,它不会被排除出候选集,被选中后触发「使用已删除函数」的编译错误。
标准条款补充说明
C++20 12.4.1.8条款仅适用于编译器自动生成并标记为删除的默认移动特殊成员函数,这类函数会被排除在候选集之外。而用户显式声明并删除的函数不属于此范畴,仍会正常参与重载决议,选中即报错。
解决逻辑
移除显式删除的operator=(foo&&)后,编译器不会生成默认移动赋值(因为你已显式声明拷贝赋值),此时重载决议只能选择operator=(const foo&),代码即可正常编译。
内容的提问来源于stack exchange,提问作者cpp is hard
相关产品推荐
相关产品推荐

