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;
}
上面的代码使 operator=(int)
在两者都存在时运行,如果 operator=(int)
被注释,则 foo(int)
(或相反)。
最佳答案
这是基本的过载解决方案。两种重载都是可行的:
将
57
绑定(bind)到foo::operator=(int)
(完全匹配)通过转换构造函数将
57
隐式转换为foo
,并将临时foo
对象绑定(bind)到隐式定义的foo::operator=(foo const &)
。
由于后者比前者需要更多的转换,匹配度较差,因此选择了前者重载。
你仍然可以通过显式来实现第二个调用:
f = foo(57); // binds perfectly to foo::operator=(foo const &)
整套重载决议规则相当长且复杂,但在像这样的个别情况下,答案是直截了当的。不过,请参阅 13.3 ([over.match]) 了解完整的详细信息。
关于c++ - 关于转换构造函数和赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21365738/