如何解决为什么结构可以隐式转换以匹配函数的参数类型,但如果它是赋值运算符并删除默认值,则不能?
示例:
struct c{
void operator=(bool){}
operator bool(){
return false;
}
c&operator=(const c&)=delete;
};
void f(bool){}
int main(){
c a,b;
f(b); //works fine
a=b; //g++ -std=c++17 says: error: use of deleted function ‘c& c::operator=(const c&)’
}
为什么 f(b)
调用将 b
转换为 bool
以匹配 f
的类型,但 a=b
坚持不转换?
解决方法
重载解析的工作原理是找到最佳匹配,然后检查函数的可访问性。如果您无法访问该功能,因为它受保护/私有或已删除,那么您会收到错误消息。随着
f(b);
唯一有效的选项是 operator bool()
所以代码有效。随着
a=b
编译器发现
c&operator=(const c&)
// and the chain
operator bool() -> void operator=(bool)
第一个是更好的匹配,所以它是使用的重载,因为它被标记为 delete
,你会得到一个编译器错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。