c ++:cast运算符与assign运算符与转换构造函数优先级

时间:2012-09-09 00:54:33

标签: c++ casting copy-constructor assignment-operator

我们有这个代码:

Test1 t1;
Test2 t2;
t1 = t2;

我相信有三种(或更多?)方法可以实现t1 = t2

  • Test1
  • 中重载指定运算符
  • Test2
  • 中重载类型强制转换运算符
  • 创建Test1(const Test2&)转换构造函数

根据我的GCC测试,这是所用内容的优先级:

  1. 指定运营商
  2. 转换构造函数和类型转换操作符(不明确的)
  3. const转换构造函数和const类型转换操作符(不明确的)
  4. 请帮助我理解为什么要优先考虑。

    我使用此代码进行测试(取消注释某些行以试用)

    struct Test2;
    struct Test1 {
      Test1() { }
      Test1(const Test2& t) { puts("const constructor wins"); }
    //  Test1(Test2& t) { puts("constructor wins"); }
    //  Test1& operator=(Test2& t) { puts("assign wins"); }
    };
    
    struct Test2 {
      Test2() { }
    //  operator Test1() const { puts("const cast wins"); return Test1(); }
    //  operator Test1() { puts("cast wins"); return Test1(); }
    };
    
    
    int main() {
      Test1 t1;
      Test2 t2;
      t1 = t2;
      return 0;
    }
    

2 个答案:

答案 0 :(得分:13)

声明t1 = t2;等同于:

t1.operator=(t2);

现在通常的重载决策规则适用。如果有直接匹配,那就是所选择的。如果不是,那么隐式转换被认为与(自动生成的,“隐式定义的”)复制赋值运算符一起使用。

有两种可能的隐式用户定义转换。所有用户定义的转换计数相等,如果两者都定义,则重载是不明确的:

  • 通过t2转换构造函数将Test1转换为Test1::Test1(Test2 const &)

  • 通过t2强制转换操作符将Test1转换为Test2::operator Test1() const

答案 1 :(得分:0)

当我使用下面的代码时,首先给构造函数赋予优先级而不是强制转换运算符

by_id = group_by_key(rows, 'id')

for id_num, group in list(by_id.items()):
    by_id[id_num] = max(group, key=lambda r: r['date'])

print(by_id.values())
  

输出构造函数名为