gpt4 book ai didi

c++ - std::vector operator==: 值或引用比较?

转载 作者:太空狗 更新时间:2023-10-29 19:44:12 27 4
gpt4 key购买 nike

所以,我试图为 When does x==x+2 想出一个解决方案在 codegolf 上的 C++ 中,想出了这个片段只是为了意识到我不知道它是如何工作的。我不确定为什么这两个条件都评估为真。

有谁知道标记为 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;
}

似乎——因为 vector 似乎是按值比较的——如果 x 在 x+2 之前求值,那么 x 就不会等于 x+2(按值)。我可能遗漏了一些明显的东西。提前致谢。

最佳答案

对于标准容器,operator== 被重载为 std::equal .这反过来适用于迭代器并通过取消引用应用比较,如 *it1 == *it2 中所示。因此,不需要拷贝。

表达式 x == x + 2operator==(x, x + 2) 相同。两个操作数在函数调用之前计算,并且由于 x + 2 修改 x,因此两个操作数相同。因此等式成立。

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

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

关于c++ - std::vector operator==: 值或引用比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12411399/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com