类的类型转换函数导致二义性的场景

首先介绍类的类型转换函数用法
operator typename() const

class A{
public:
    A(int i=0):val(i)
    operator int ()const{
        return val;
    }
private:
    int val;
}
A si;
si=4;//4隐式转换为si
si+4;//si隐式转换为Int

二义性场景1:

sturct B;
sturct A{
    A()=default;
    A(const B&);//构造函数,B->A
};
struct B{
    operator A()const;//类型转换函数 B->A
};
A f(const A&);
B b;
A a=f(b);//二义性错误,含义是f(B::operator A())还是f(A::A(const B&))?

二义性场景2

struct A{
    A(int =0);
    A(double);
    operator int()const;
    operator double()const;
};
void f2(long double);
A a;
f2(a)//二义性错误,a是转换成int还是double?
如果f2(long ) 依然会二义性错误,因为doubleint对于long都不是精确匹配

二义性场景3

struct C{
    C(int);
};
struct D{
    D(int);
};
void manip(const C&);
void manip(const D&);
manip(10);//二义性错误,10是转C还是转E

二义性场景4


struct E{
    E(double);
};
void manip2(const C&);
void manip2(const E&);
manip2(10);//二义性错误,因为int可以先转double再转E,这个是可以匹配的。很奇怪,但是就这样。

二义性场景5

class A{
    friend A operator+(const A&,const A&);
public:
    A(int=0);
    operator int() const{return val};
private:
    int val;

A s1,s2;
A s3=s1+s2;//这个没问题
int i=s3+0;//你是把s3往Int转还是0往A转呢? 函数返回类型是不影响类型转换的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值