gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:35:38 24 4
gpt4 key购买 nike

让我们有这段代码:

Test1 t1;
Test2 t2;
t1 = t2;

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

  • Test1 中重载赋值运算符
  • Test2 中重载类型转换运算符
  • 创建Test1(const Test2&)转换构造函数

根据我的 GCC 测试,这是使用的优先级:

  1. 分配运算符(operator)
  2. 转换构造函数和类型转换运算符(不明确)
  3. const 转换构造函数和const 类型转换运算符(有歧义)

请帮助我理解为什么这个优先级。

我使用这段代码进行测试(取消注释一些行来尝试)

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;
}

最佳答案

语句 t1 = t2; 等同于:

t1.operator=(t2);

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

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

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

  • 通过 Test2::operator Test1() const 转换运算符将 t2 转换为 Test1

关于c++:转换运算符与赋值运算符与转换构造函数优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12335684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com