2011-02-27 82 views

回答

12

我不會超載operator&&operator||。即使你定義了一個產生布爾代數的類(例如有限集),它也可能是一個更好的選擇,可以重載operator&operator|

的原因是,C++程序員需要特殊語義operator&&operator||:他們是短路,即不如果沒有必要評估他們的右手的說法。你不能通過重載來獲得這種行爲,因爲你會定義一個函數。

超載operator,已經在例如圖書館的Boost.Assign。這也是我知道的重載的唯一例子,我從來沒有考慮過自己重載它。在沒有其他運營商適合的情況下,您最好有一個非常具體的用例。

+0

好點。所以,在這種情況下('operator bool()')提供一個轉換爲bool的運算符似乎更好? – davka 2011-02-27 12:36:03

+0

@davka:是的,如果您的類具有布爾邏輯語義,則可以定義'operator bool',從而免費爲您提供短路。定義'operator&'和'operator |'如果它具有布爾代數語義,如有限集合(其中交集是'&',union是''')。 – 2011-02-27 12:38:49

+0

@Downvoter:請解釋。 – 2011-02-27 13:13:51

4

對於C++中的邏輯運算符的重載,必須對運算對象進行求值,這不是通常情況下內建類型短路的方式。

看看下面的鏈接。

+2

這並沒有說有關運營商的話。 – davka 2011-02-27 12:11:05

+0

糟糕。我的錯。抱歉。我誤解了這個問題。 – 2011-02-27 12:13:24

+0

@All:編輯答案 – 2011-02-27 12:19:59

0

的情況下,除了它的壞主意,當你的類代表一些邏輯實體,因爲超載運營商將迷失方向,並可以在代碼中造成新的漏洞。

+0

即使在定義「邏輯實體」(布爾代數)時,其他運算符也更適合。 – 2011-02-27 12:33:53

2

我想說這取決於你的重載在做什麼。例如,& &和||預計會作爲邏輯條件工作,所以如果你的超載語義在某種程度上以不同的方式工作,他們可能會混淆其他人(或者甚至你自己,如果你一段時間不使用它們並忘記它們的作用)。考慮一下如果你不知道它們是如何被重載的,你會期望操作員做什麼,以及如果使用普通方法代替它會更清楚。

2

正如其他人所說,缺少懶惰評估是避免邏輯運算符超載的主要原因。

但是,有一個很好的理由讓它們超載:Expression templates。 Boost.Lambda庫可以做到這一點,它非常有用!

3

這通常是一個糟糕的主意:這三個操作符有一個排序效應,當你超載它們時會丟失。消除這種排序效應會導致那些不期待丟失的人(即奇怪的錯誤)。

有些模板表達式可以保持排序效果,在這些情況下,我認爲在重載它們時沒有問題。

我知道operator,的重載有另一個問題:它們的工作方式使得表觀鏈不是真正的鏈。通常情況下,它們在沒有區別的情況下使用,但在藍色月亮中使用時,這是另一個奇怪錯誤的來源。

3

您不應該以驚人的方式重載任何操作符。:-)

如果你能以一種合理的方式做到這一點(不僅僅是你),這樣做很好。

和其他人一樣,邏輯運算符的特殊之處在於它們具有懶惰評估的效果。所以你的重載應該可以保持這種懶惰的效果,就像使用表達式模板一樣,或者只在人們不希望這種效果的地方使用。