所以,我试图在codegolf上为C++提供x == x + 2时的解决方案,并想出这个片段只是为了意识到我不知道它是如何工作的.我不确定为什么这两个条件都评估为真.
有人知道标记的行是否line:为真,因为x ==&x或者因为在==的左侧之前评估了x + 2?
#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;
}
Run Code Online (Sandbox Code Playgroud)
似乎 - 因为向量似乎按值进行比较 - 如果x在x + 2之前被评估,那么x将不等于x + 2(按值).我可能错过了一些明显的东西.提前致谢.
对于标准容器,operator==重载为std::equal.这反过来适用于迭代器并通过去除来应用比较,如*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;
}
Run Code Online (Sandbox Code Playgroud)