关于转换构造函数和赋值运算符

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)被注释(或相反).

Ker*_* SB 8

这是基本的重载决议.两种重载都是可行的:

  1. 绑定57foo::operator=(int)(完全匹配)

  2. 隐式转换57foo通过转换构造函数,并将临时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])了解完整的血腥细节.