Iva*_*ars 2 c++ constructor operator-overloading assignment-operator operator-keyword
如何操作foo = int可以由foo(int)(转换构造函数)和foo::operator=(int)(重载赋值运算符)完成?当一个人被召唤而不是其他人(也许一个是基本的)?
#include <iostream>
class foo
{
public:
foo(){}
foo(int r_value)
{
std::cout << "\nfoo::foo(int)\n";
}
void operator=(int r_value)
{
std::cout << "\nfoo::operator=(int)\n";
}
};
int main()
{
foo f;
f = 57;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码使得operator=(int)当同时存在来运行和foo(int)如果operator=(int)被注释(或相反).
这是基本的重载决议.两种重载都是可行的:
绑定57到foo::operator=(int)(完全匹配)
隐式转换57为foo通过转换构造函数,并将临时foo对象绑定到隐式定义的foo::operator=(foo const &).
由于后者需要比前者更多的转换,因此它是一个不太好的匹配,并且选择前一个过载.
您仍然可以通过明确表达来实现第二个调用:
f = foo(57); // binds perfectly to foo::operator=(foo const &)
Run Code Online (Sandbox Code Playgroud)
重载决策的全套规则相当长且涉及,但在这样的个别情况下,答案是直截了当的.不过,请参阅13.3([over.match])了解完整的血腥细节.
| 归档时间: |
|
| 查看次数: |
1095 次 |
| 最近记录: |