2015-09-28 67 views
3

假設我正在寫一個int包裝,並且需要提供每一個操作符的過載。作者必須列出每一個作者,還是可以根據作者提供的內容自動生成作品?編譯器能否推斷現有的新自動定義的運算符?任何C++運算符重載是否基於其他提供?

如果我定義了operator==,它會自動給我一個operator!=嗎?或相反亦然?

如果我定義了operator++(),我可以免費獲得operator++(int)嗎?或相反亦然?

+=型業務如何?它是否可以結合operator+的現有定義與operator=生成operator+=?理論上它應該是可能的,但是呢?

>=<等同樣的問題呢,還是要充分列出定義爲>>>=<=

+2

有[比較運營商違約]的建議(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4126.htm)。 – user657267

+0

測試這很容易。 – juanchopanza

+1

boost有一些基於其他的操作符:http://www.boost.org/doc/libs/1_59_0/libs/utility/operators.htm – stefaanv

回答

4

在覈心語言中,各種操作符是獨立的。有些是以其他方式來定義的,但是如果運算符調用的重載解析失敗,那麼就不會試圖用其他運算符來表示該調用。當需要時,程序員可以很容易地表達(相反,關閉這樣的機器,可能會更困難)。

std::rel_ops中有一組客戶端代碼可以使用的一組關係運算符重載,根據<==定義。

您可以很容易地編寫一個混合類,它提供了關係運算符<==,或者根據三值函數compare提供。這是Curiously Recurring Template Pattern的原始動機,稱爲Barton-Nackman trick

2

C++有核心語言沒有推理規則,所以即使定義說+不承擔任何關於+= ...他們只是(儘可能的語言去)完全無關。

考慮到標準庫中的<<(左移位運算符)已被重載爲「輸出到流」......僅僅是因爲外觀和明智的優先級和相關性。

+0

看起來你是對的,但是像==和'!='這樣的東西在99%的應用程序中本質上是相似的......他們可以自動生成它,並且要求用戶刪除自動生成的應用程序if他們想要做一些奇怪的事情。 – VoidStar

+0

請注意,通常的推論是從'+ ='到'+',而不是相反。特別是'c = a + b'被推斷爲'c = a; c + = b;'。原因是在CPU級別,'+'更復雜。它需要兩個輸入寄存器和一個輸出寄存器。 '+ ='只需要一個輸入寄存器。 – MSalters

+0

@MSalters:在過去,我花了一些時間研究在C++中定義一個n維向量類(數學意義上的向量)時最好的代碼質量。我發現,根據編譯器的不同,根據編譯器的不同,有些實現更好地用'+ ='來定義'+',而另一些則相反,不幸的是,沒有實現生成與手動展開的代碼一樣好的代碼。組件數學。這是幾年前,現在可能編譯器更聰明,情況更好。 – 6502