我想为简单的结构重载==运算符
struct MyStruct {
public:
int a;
float b;
bool operator==( ) { }
}
我看到的所有示例似乎都使用&通过引用传递了值。
但是我真的很想按值传递这些结构。
我写成
有什么问题吗?bool operator== (MyStruct another) { return ( (a==another.a) && (b==another.b) ); }
答案 0 :(得分:1)
期望您在按价值传递时支付副本的罚款确实不重要。如果结构真的很重,则适用。在您引用的简单示例中,可能没有太大区别。
话虽如此,通过const reference
传递更有意义,因为它清楚地表达了重载函数==
的意图。 const
确保重载函数意外地不会修改对象,并且按引用传递可以使您免于复制。对于==
运算符,无需出于比较目的而传递副本。
如果您担心一致性,最好将其他按值传递实例切换为按const ref传递。
答案 1 :(得分:1)
保持一致是值得称赞的目标,但不应过分。仅包含“ A”字符的程序将非常一致,但几乎没有用。争论传递机制并不是您所做的不一致的事情,它是基于某些技术方面的技术决策。
例如,在您的情况下,按值传递可能可能会导致更好的性能,因为该结构足够小并且在AMD64 ABI上使用(该结构可在任何64位Intel / AMD芯片上使用),它将在寄存器中传递,从而节省了通常与取消引用相关的时间。
在您的情况下,可以合理地假设该函数将被内联,并且传递方案完全无关紧要(因为它不会被传递)。此处的代码生成已证明了这一点(生成的程序集中不存在对operator==
的调用):https://gcc.godbolt.org/z/G7oEgE