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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |