所以只是因爲你不知道基本表達式是如何工作的,C++ 11 auto關鍵字是愚蠢的?這對你有什麼意義?
在表達式auto c = a - b;
中,auto c =
與在子表達式a - b
中使用的類型沒有任何關係。
自從第一個C語言草案表達式使用的類型由該表達式的操作數決定。從預標準K & R C到C++ 17的所有內容都是如此。
現在,如果您想要負數,您需要做的事情不是太奇怪,使用負類型。在調用-
運算符之前,將操作數更改爲(有符號)int
或將它們轉換爲該類型。
將結果聲明爲帶符號的類型而不改變-
的操作數的類型不是一個好主意,因爲那時您強制從無符號到有符號的轉換,這不一定是明確定義的行爲。
現在,如果操作數有不同的類型,或者是小的整數類型的,他們將獲得隱含按照通常的算術轉換推廣。這不適用於這種特定情況,因爲兩個操作數的類型都是相同的,而不是小整數類型。
但是... 這個是爲什麼auto
關鍵字是愚蠢和危險的。考慮:
unsigned short a = 7;
unsigned short b = 23;
auto c = a - b;
由於兩個操作數都是無符號的,程序員打算使用無符號算術。但是在這裏,兩個操作數都被隱含地提升爲int
,並且意外地改變了簽名。關鍵字auto
假設沒有任何事情發生,而unsigned int c = a - b;
會增加編譯器診斷消息的機會,或者至少增加來自外部靜態分析工具的警告的機會。而且它也會意外地平滑出本來可能是簽名改變錯誤的東西。
另外,由於auto
我們最終會得到聲明變量的錯誤,無意的類型。
「正如你所看到的,我預計'c'變量的類型應該是'int'」你爲什麼這麼期待? –
'7u - 23u'是一個有效的無符號計算。你爲什麼期望它改變? – CinCout
'auto'非常聰明。整體促銷規則在此不適用(即不需要促銷)。 – StoryTeller