2014-02-26 49 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”举例来说。 –

相关问题