2014-02-26 99 views
10

一個簡單的問題:爲什麼不C++ 11提供一個 「用戶」(真的,標準庫)創建std::string定義的文字,如爲什麼沒有標準定義的文字後綴爲std :: string?

auto str = "hello world"s; // str is a std::string 

像C++,Objective-C的支持C風格的字符串和更加用戶友好的庫類型NSString;然而,與C++不同,沒有人會在兩者之間產生混淆,因爲通過在字符串前加上@來創建NSString並不重要。實際上,很少看到Objective-C代碼,其中文字不包含前綴@。每個人都知道這是做到這一點的方法,使用NSString並繼續。

C++ 11個用戶定義的文字將允許這樣做,實際上Stroustrup的C++ 11 FAQ中的UDL部分正好使用了這個例子。此外,沒有帶前導下劃線的UDL是保留的,所以在允許上述普通的s時沒有問題 - 它不可能與其他任何事情衝突。

也許我錯過了一些東西,但似乎這將是一種非常有價值且無風險的語言附加,所以有人知道爲什麼C++ 11不提供它嗎?它可能出現在C++ 14中嗎?

回答

19

用戶定義的文字在C++ 11中已經足夠新,這不包括在內,但是它在C++ 14中(在§21.7中,如果有人在意)。是的,它使用s作爲後綴。精確的結果類型取決於字符串文本本身的類型 - 「窄」文字給出std::string,u16文字給出u16string,而u32文字給出u32string。哦,是的,如果你堅持使用寬字符串文字,它會產生一個wstring

注意,s後綴也用來指秒(在<chrono>定義),但有一個字符串字面量two-- s之間沒有真正的衝突是指一個字符串,s多項表示秒。

+2

那麼,我們走了,在幾秒鐘內完美的答案,+1(或更多,如果我可以)。奇怪的是,它不是最初的UDL提案的一部分,但我們走了。我期待最終(希望)在C++ 14中失去'char *'的詛咒! –

+0

我特別喜歡和'auto'結合使用它# – Excelcius

+2

@Excelcius:比'auto'(至少IMO)更重要的是表達式,比如將字符串加在一起:'「A」s +「B」舉例來說。 –

相關問題