加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么转换到引用会干扰转换为bool?

发布时间:2020-12-16 05:48:00 所属栏目:百科 来源:网络整理
导读:看来如果我有一个转换操作符到引用,这个操作符将优先于一个转换为一个bool.为什么会发生这种情况,我该如何解决? (如果重要,我使用的是GCC 4.5,我在ideone上验证了与GCC-4.7.2相同的行为.) 假定如下: class B {protected: const int a_; int b_; B (int b,i
看来如果我有一个转换操作符到引用,这个操作符将优先于一个转换为一个bool.为什么会发生这种情况,我该如何解决?

(如果重要,我使用的是GCC 4.5,我在ideone上验证了与GCC-4.7.2相同的行为.)

假定如下:

class B {
protected:
    const int a_;
    int b_;
    B (int b,int a) : a_(a),b_(b) {}
public:
    operator bool () const { return b_ == a_; }
};

class D1 : public B {
public:
    D1 (int b = 0,int a = 0) : B(b,a) {}
    operator int () const { return b_; }
};

class D2 : public B {
public:
    D2 (int b = 0,a) {}
    operator int & () { return b_; }
};

然后,假设它们在这样一个简单的程序中使用:

int main () {
    if (D1 d1a = D1('a','a')) std::cout << "d1an";
    if (D1 d1b = D1('b','a')) std::cout << "d1bn";
    if (D2 d2a = D2('a','a')) std::cout << "d2an";
    if (D2 d2b = D2('b','a')) std::cout << "d2bn";
    return 0;
}

该程序的输出是:

d1a
d2a
d2b

请注意,d1b不在输出中,这意味着转换为bool的方式对D1进行了预期.但是,对于D2,似乎对引用类型的转换优先于bool转换.为什么会发生这种情况?有没有一个简单的改变,我可以做到D2允许bool转换优先在if检查?

目前,我正在使用D1并添加一个赋值运算符来实现引用的行为.

解决方法

实际上,它与int而无关,这是一个常态:
operator bool () const { return b_ == a_; }
              /* ^^^^^ */
              /* vvvvv */
operator int & () { return b_; }

d2a是D2,而不是const D2,所以非const转换运算符更适合.如果你把它写成

operator const int & () const { return b_; }

你会得到预期的行为,见http://ideone.com/vPPPYV.

请注意,运算符const int&即使您使用对象的const版本也不会干扰,以下行仍会导致您的预期行为(参见http://ideone.com/DTE0xH):

if (const D1 d1a = D1('a','a')) std::cout << "d1an";
if (const D1 d1b = D1('b','a')) std::cout << "d1bn";
if (const D2 d2a = D2('a','a')) std::cout << "d2an";
if (const D2 d2b = D2('b','a')) std::cout << "d2bn";

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读