一,規格是,它會返回一個值小於,等於少 到或大於0
,不一定是-1
或1
。其次,返回值是右值,受到積分 的提升,所以沒有必要返回更小的東西。
在C++中(如在C中),每個表達式都是一個右值或一個左值。從歷史上看,這些術語指左值出現在賦值左側的左值 ,右值只能出現右值 。今天, 非類類型的簡單近似值是左值在內存中有一個地址,而右值不是。因此,你不能採用右值的地址 和cv-qualifiers(條件「訪問」)不適用。在 C++術語中,不具有類類型的右值是純粹的 值,而不是對象。函數的返回值是一個 右值,除非它具有引用類型。 (這 適合在寄存器幾乎總是在寄存器返回非類類型, 例如,而不是在內存中。)
對於類類型的情況下,問題更復雜一點,由於 事實上你可以在右值上調用成員函數。這個 意味着右值必須實際上具有地址,對於指針,並且可以是cv限定的,因爲cv資格 在重載解析中發揮作用。最後,C++ 11引入了 幾個新的區別,以支持右值引用;這些也都主要適用於班級類型。
積分促銷指的是事實,當整型 比int
小在表達式中被用作右值,在 大多數情況下,他們將晉升爲int
。因此,即使 我有一個聲明爲short a, b;
的變量,在表達式a + b
中,在添加 發生之前,a
和b
都被提升爲int
。同樣,如果我編寫a < 0
,則比較結果爲 ,其值爲a
,轉換爲int
。在實踐中,有很少的情況下,這是有差別的,至少在 2的補充機器整數算術包裝(即 除了極少數的外國人,今天—我認爲唯一的例外是剩餘的大型機) 。不過,即使在 比較常見的機器:
short a = 1;
std::cout << sizeof(a) << std::endl;
std::cout << sizeof(a + 0) << std::endl;
應該給予不同的結果:第一是 sizeof(short)
,第二sizeof(int)
(因爲 積分促銷)的等價物。
這兩個問題是正式正交的; rvalues和lvalues 與整體推廣無關。 除 ... 積分促銷僅適用於右值,並且大多數(但不是 全部)您將使用右值的情況下將導致 積分促銷。出於這個原因, 確實沒有理由返回小於int
的數值。 甚至有一個很好的理由不把它作爲 作爲字符類型返回。重載運算符(如<<
)對字符類型的行爲經常表現爲 ,因此您只希望返回 字符作爲字符類型。 (您可能比較 區別:
char f() { return 'a'; }
std::cout << f() << std::endl; // displays "a"
std::cout << f() + 0 << std::endl; // displays "97" on my machine
不同的是,在第二種情況下,除了擁有 導致出現積分的推廣,這將導致不同的 超載<<
被選爲
我認爲如果有更具體的類型可以用於此目的,會更好。其中只包含Ada95風格的-1,0和1。 – 2013-03-11 12:30:15
「string :: compare()」的文檔明確指出返回值是<0, 0, and > 0 -not- -1,0和1. – 2013-03-11 12:31:52
使用short或char的優點是什麼? 'int'?大多數體系結構都將函數的返回值存儲在一個寄存器中,並且'int'和'short'或'char'一樣可以放入寄存器。對於數字類型使用'char'總是一個壞主意,特別是當你需要保證有符號值被正確處理時。 – 2013-03-11 12:38:39