为什么结构可以隐式转换以匹配函数的参数类型,但如果它是删除了默认值的赋值运算符则不能?
Why can a struct implicitly convert to match a function's parameter type, but not if it's an assignment operator with the default one deleted?
示例:
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
坚持不转换?
过载解析的工作原理是找到最佳匹配,然后检查函数的可访问性。如果您无法访问该函数,因为它的 protected/private 或已删除,则会出现错误。有
f(b);
唯一有效的选项是 operator bool()
,因此代码有效。有
a=b
编译器发现
c&operator=(const c&)
// and the chain
operator bool() -> void operator=(bool)
第一个是更好的匹配,所以它是重载,因为它被标记为 delete
,你会得到一个编译器错误。
示例:
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
坚持不转换?
过载解析的工作原理是找到最佳匹配,然后检查函数的可访问性。如果您无法访问该函数,因为它的 protected/private 或已删除,则会出现错误。有
f(b);
唯一有效的选项是 operator bool()
,因此代码有效。有
a=b
编译器发现
c&operator=(const c&)
// and the chain
operator bool() -> void operator=(bool)
第一个是更好的匹配,所以它是重载,因为它被标记为 delete
,你会得到一个编译器错误。