2013-01-16 22 views
27

曾是一元+運營商只是爲了對稱的一元-操作呢,還是找到C++代碼中的一些實際用途?一元+運算符有任何實際用途嗎?

搜索在這裏,我遇到了What is the purpose of the unary '+' operator in C?,但唯一有用的方案有涉及預處理宏。這些知識很好,但它們似乎是一些不太常見的情況,並涉及宏。有沒有涉及更常見的C++代碼的用例?

+6

數學?但是,它可能會在運算符重載類中找到用處。 – ApproachingDarknessFish

+0

@ValekHalfHeart:是的,但任何除「return * this」外的任何重載都會被視爲濫用。 – rodrigo

+0

@rodrigo但是仍然可以提供'this'的副作用,不是嗎?如果這是好的或有用的DSL設計是另一個問題。 –

回答

31
char ch = 'a'; 
std::cout << ch << '\n'; 
std::cout << +ch << '\n'; 

第一插入寫入字符acout。第二次插入將數字值ch寫入cout。但這有點模糊不清。它依賴於編譯器對+運算符應用積分促銷。

+12

噢......這是*淫* –

+0

數值是它的ASCII等值? – 0x499602D2

+1

@David - 使用ASCII的編譯器,是的。對於其他編碼(罕見),不。 –

21

對稱性與一元-不是完全無用;它可以被用於強調:

const int foo = -1; 
const int bar = +1; 

而一個重載一元+可以用於表示產生相同邏輯值作爲操作數的運算,在執行一些非平凡的計算。 (我已經看到了這一點做了Ada中,允許一元+類型轉換,但不轉換,超載)。我沒有一個很好的C++例子出手,而有人會說,這將是作風不好。 (再說,我已經看到了很多有關超載的<<咆哮。)

至於爲什麼 C++有它,這可能主要是出於一致性C,這與1989年的ANSI標準添加它。該C Rationale只是說:

一元加了幾個 實現通過了C89委員會,與一元減對稱性。

+3

+1一個可愛的報價。 – sehe

10

如果你明確地避開任何數量的值語義的一類,任何運算符重載是明確的不要「做的整數做」。在這種情況下,一元加號可以得到任何意義,這樣做不僅僅是返回*this

突出的例子更多:Boost.Spirit's unary plus嵌入式EBNF的Kleene Plus生成語法分析規則,允許它的參數(語法分析規則以及)匹配一個或更多次。

+1

我希望我們可以重載'@',''''和'#'。 –

+0

@MooingDuck當你處於這種狀態時,我們是否能夠使用'+ - * /%=!<>〜^ |&*。[]()@#$ '? –

+0

這些大多數會使解析模糊。如果編譯器看到「a + -b」,是內置函數還是用戶超載? –

1

一元+應用整體促銷活動。 @ PeteBecker的答案顯示了一種可能有用的方法。

其次,注意,未範圍枚舉類型被提升到一個整數類型可以表示在enum所有值。因此,在C++ 03,即使沒有C++ 11的std::underlying_type<T>,你可以這樣做:

enum MyBitMask { 
    Flag1 = 0x1, 
    Flag2 = 0x2, 
    Flag3 = 0x4, 
    Flag4 = 0x8000000 
}; 

inline MyBitMask operator&(MyBitMask x, MyBitMask y) { 
    return static_cast<MyBitMask>(+x & +y); 
} 

inline MyBitMask operator|(MyBitMask x, MyBitMask y) { 
    return static_cast<MyBitMask>(+x | +y); 
} 
4

一元+操作者接通一個左值到右值:

struct A { 
    static const int value = 1; 
}; 

// ... 

int x = std::min(0, A::value); 

糟糕!此代碼不會鏈接,因爲有人忘了定義(以及聲明)A::valuestd::min通過引用,採用它的參數,以便A::value必須有一個地址,這樣的引用可以綁定到它(從技術上說,一個定義規則說,它必須在程序恰好被定義一次。)

沒關係,一元加上救援:

int x = std::min(0, +A::value); 

一元加號創建一個臨時用相同的值,參考結合到暫時的,這樣我們就可以解決缺少的定義。

這不是你經常需要的東西,但它是一元加操作符的實際用法。

1

有點晚了,但這是一個非常扭曲的使用,我偶然發現。顯然,在設計可能遇到空預處理器標記的保護措施時,運算符可能很有用(如果可能不是絕對必要的話)。請參閱this post進行更深入的討論。

這是實用的,但絕不令人愉快。

相關問題