C++11 FAQ中文版:显式转换操作符

显式转换操作符

C++98标准提供隐式和显式两种构造函数,也就是说,声明为显式形式的构造函数所定义的转换只能用于显式转换,而其他形式的构造函数则用于隐式转换。例如:

struct S { S(int); };    // “普通构造函数”表明是隐式转换
S s1(1);        // 正确
S s2 = 1;    // 正确
void f(S);
//正确(但是经常会产生意外结果——如果S是vector类型会怎么样呢?)(?)
f(1);   

struct E { explicit E(int); };    // 显式构造函数
E e1(1);        // 正确
E e2 = 1;    // 错误(但是常常会让人感到意外——这怎么会错呢?)
void f(E);
// 错误(不一定会产生意外
// 例如从int型到std::vector类型转换的构造函数是显式的)(?)
f(1);

然而,构造函数不是定义转换的唯一途径。如果不能更改一个类,那么可以从另一个不同的类中定义一个转换操作符。例如:

    struct S { S(int) { } /* … */ };

    struct SS {
        int m;
        SS(int x) :m(x) { }
        // 因为结构体S中没有S(SS);不存在干扰
        operator S() { return S(m); }
    };

    SS ss(1);
    S s1 = ss;    // 正确;类似隐式构造函数
    S s2(ss);    // 正确;类似隐式构造函数
    void f(S);
    f(ss);        // 正确;类似隐式构造函数

(译注:这段代码的意义,实际是通过SS作为中间桥梁,将int转换为S。)
遗憾的是,这里并没有显式转换操作符(因为有问题的例子很少)。C++11通过允许转换操作符成为显式形式而弥补了这个漏失(?)。例如:

    struct S { S(int) { } };

    struct SS {
        int m;
        SS(int x) :m(x) { }

        // 因为结构体S中没有S(SS)(译注:因为结构体S中没有定义S(SS),
        // 无法将SS转换为S,所以只好在SS中定义一个返回S的转换操作符,
        // 将自己转换为S。转换动作,可以由目标类型S提供,也可以由源类型SS提供。)
         explicit operator S() { return S(m); }
    };

    SS ss(1);
    S s1 = ss;    // 错误;类似显式构造函数
    S s2(ss);    // 正确;类似显式构造函数
    void f(S);
    f(ss);        // 错误;类似显式构造函数

参考:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值