簡體   English   中英

定義運算符的實際原因!=

[英]Practical reason for defining operator!=

以下代碼將無法在GCC下編譯,因為它確實定義了operator==但沒有定義operator!=

struct A {
    unsigned int m_i;
    bool operator == (const A& rhs) const { return m_i == rhs.m_i; }
};

bool f(const A& lhs, const A& rhs) { return lhs != rhs; }

顯然它想要

bool operator != (const A& rhs) const { return !(operator==(rhs)); }

要么

bool operator != (const A& rhs) const { return m_i != rhs.m_i; }

普遍的觀點似乎是因為!operator==會添加一條指令,因此效率較低。 這導致一些程序員將其復雜的!=表達式完整地寫出來,並且多年來,我修復了許多由於運算符不匹配而導致的錯誤。

給兩個運算符寫代碼是否是過早/遺留優化的一種強制,還是有一個很好的,可靠的,實際的理由進行這種代碼加倍,而我卻以某種方式丟失了?

我會說沒有相反的壓倒性證據,那純粹是過早的優化(甚至不是傳統的優化-我懷疑這樣做是否有充分的理由,至少在接近C ++時限的任何情況下)。

就其價值而言,C ++標准的§20.2.1定義了<utility>中的許多重載,這些重載將為您提供基於operator==!=和基於operator<所有>>=<=

為什么不使用這個:

bool f(const A& lhs, const A& rhs) { return !(lhs == rhs); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM