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

c – std :: vector operator ==:值或参考比较?

发布时间:2020-12-16 10:32:07 所属栏目:百科 来源:网络整理
导读:所以,我试图在codegolf上用C语言提出一个 When does x==x+2的解决方案,并想出了这个片段只是为了意识到我不知道它是如何工作的.我不确定为什么这两个条件都评估为真. 有没有人知道标记为line的行是否为真,因为x == x或因为x =在==的左侧之前进行求值? #incl
所以,我试图在codegolf上用C语言提出一个 When does x==x+2的解决方案,并想出了这个片段只是为了意识到我不知道它是如何工作的.我不确定为什么这两个条件都评估为真.

有没有人知道标记为line的行是否为真,因为x ==& x或因为x =在==的左侧之前进行求值?

#include <iostream>
#include <vector>

std::vector<int>& operator+ ( std::vector<int> &v,int val )
{
    v.push_back(val);
    return v;
}

int main()
{
    std::vector<int> x;
    std::vector<int> y = x + 2; // y is a copy of x,and x is [2]

    // how are both of these are true?
    std::cout << (x==y) << "n";    // value comparison [2]==[2]
line:
    std::cout << (x==x+2) << "n";  // reference comparison? &x == &(x+2)

    // not sure if this is relevant
    std::cout << (x+2==x) << "n";  // also true

    return 0;
}

似乎 – 因为向量似乎是按值进行比较 – 如果x在x 2之前被评估,那么x将不等于x 2(按值).我可能错过了一些明显的东西.提前致谢.

解决方法

对于标准容器,operator ==被重载为 std::equal.这反过来适用于迭代器并通过dereferncing应用比较,如* it1 == * it2.因此,不需要副本.

表达式x == x 2与operator ==(x,x 2)相同.在函数调用之前评估两个操作数,并且由于x 2修改x,因此两个操作数是相同的.因此,平等成立.

令人惊讶的是您在超载运算符时的非常规设计选择的结果.这通常是不良做法,也是任何协作项目中的禁忌.如果你绝对必须重载运算符,那么只有当它们按预期运行时,遵循既定的语义并且不足为奇. -operator的通常行为是按值返回一个新对象,并使操作数不受影响.像这样:

std::vector<int> operator+(std::vector<int> v,int n)
{
    v.push_back(n);
    return v;
}

(编辑:李大同)

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

    推荐文章
      热点阅读