C++20隐式operator!=歧义解析:MSVC正常编译是否为BUG?
MSVC编译存在重复
operator==时调用operator!=不报错的问题判定 结论:该情况属于MSVC的编译器BUG,不符合C++20标准的规范要求
标准规则说明
C++20标准对不等运算符的解析规则明确规定:
- 当处理
!=表达式时,如果没有直接匹配的operator!=候选,编译器会自动生成重写候选:将所有可行的operator==候选纳入重载决议范围,x != y的语义等价于!(x == y) - 被
delete修饰的函数依然会参与重载决议流程,只有被选为最优候选时才会触发"调用已删除函数"的错误,不影响歧义判定阶段的逻辑
示例代码分析
struct A { bool operator ==(const A&) const = delete; }; bool operator ==(const A&, const A&) { return true; } int main() { A a; //a == a; // 所有编译器均会触发歧义错误 return a != a; // 仅MSVC可正常编译 }
本场景中a != a的重载决议候选集和a == a完全一致:成员operator==和全局operator==的参数匹配度完全相同,没有优先级高低之分,重载决议无法选出唯一最优解,理应触发歧义错误。
GCC、Clang的行为完全符合标准要求,MSVC可正常编译的异常表现,是因为其对C++20运算符重写规则的实现存在疏漏,没有正确完成歧义校验。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

