曾是一元+
運營商只是爲了對稱的一元-
操作呢,還是找到C++代碼中的一些實際用途?一元+運算符有任何實際用途嗎?
搜索在這裏,我遇到了What is the purpose of the unary '+' operator in C?,但唯一有用的方案有涉及預處理宏。這些知識很好,但它們似乎是一些不太常見的情況,並涉及宏。有沒有涉及更常見的C++代碼的用例?
曾是一元+
運營商只是爲了對稱的一元-
操作呢,還是找到C++代碼中的一些實際用途?一元+運算符有任何實際用途嗎?
搜索在這裏,我遇到了What is the purpose of the unary '+' operator in C?,但唯一有用的方案有涉及預處理宏。這些知識很好,但它們似乎是一些不太常見的情況,並涉及宏。有沒有涉及更常見的C++代碼的用例?
char ch = 'a';
std::cout << ch << '\n';
std::cout << +ch << '\n';
第一插入寫入字符a
到cout
。第二次插入將數字值ch
寫入cout
。但這有點模糊不清。它依賴於編譯器對+
運算符應用積分促銷。
對稱性與一元-
不是完全無用;它可以被用於強調:
const int foo = -1;
const int bar = +1;
而一個重載一元+
可以用於表示產生相同邏輯值作爲操作數的運算,在執行一些非平凡的計算。 (我已經看到了這一點做了Ada中,允許一元+
類型轉換,但不轉換,超載)。我沒有一個很好的C++例子出手,而有人會說,這將是作風不好。 (再說,我已經看到了很多有關超載的<<
咆哮。)
至於爲什麼 C++有它,這可能主要是出於一致性C,這與1989年的ANSI標準添加它。該C Rationale只是說:
一元加了幾個 實現通過了C89委員會,與一元減對稱性。
+1一個可愛的報價。 – sehe
如果你明確地避開任何數量的值語義的一類,任何運算符重載是明確的不要「做的整數做」。在這種情況下,一元加號可以得到任何意義,這樣做不僅僅是返回*this
突出的例子更多:Boost.Spirit's unary plus嵌入式EBNF的Kleene Plus生成語法分析規則,允許它的參數(語法分析規則以及)匹配一個或更多次。
我希望我們可以重載'@',''''和'#'。 –
@MooingDuck當你處於這種狀態時,我們是否能夠使用'+ - * /%=!<>〜^ |&*。[]()@#$ '? –
這些大多數會使解析模糊。如果編譯器看到「a + -b」,是內置函數還是用戶超載? –
一元+應用整體促銷活動。 @ 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);
}
一元+
操作者接通一個左值到右值:
struct A {
static const int value = 1;
};
// ...
int x = std::min(0, A::value);
糟糕!此代碼不會鏈接,因爲有人忘了定義(以及聲明)A::value
。std::min
通過引用,採用它的參數,以便A::value
必須有一個地址,這樣的引用可以綁定到它(從技術上說,一個定義規則說,它必須在程序恰好被定義一次。)
沒關係,一元加上救援:
int x = std::min(0, +A::value);
一元加號創建一個臨時用相同的值,參考結合到暫時的,這樣我們就可以解決缺少的定義。
這不是你經常需要的東西,但它是一元加操作符的實際用法。
有點晚了,但這是一個非常扭曲的使用,我偶然發現。顯然,在設計可能遇到空預處理器標記的保護措施時,運算符可能很有用(如果可能不是絕對必要的話)。請參閱this post進行更深入的討論。
這是實用的,但絕不令人愉快。
數學?但是,它可能會在運算符重載類中找到用處。 – ApproachingDarknessFish
@ValekHalfHeart:是的,但任何除「return * this」外的任何重載都會被視爲濫用。 – rodrigo
@rodrigo但是仍然可以提供'this'的副作用,不是嗎?如果這是好的或有用的DSL設計是另一個問題。 –