为什么std :: string没有标准定义的文字后缀?

时间:2014-02-26 06:21:27

标签: c++ c++11 stdstring user-defined-literals c++14

一个简单的问题:为什么C ++ 11没有为创建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中吗?

1 个答案:

答案 0 :(得分:20)

用户定义的文字在C ++ 11中是新的,不包括在内,但它在C ++ 14中(在§21.7中,如果有人关心的话)。是的,它使用s作为后缀。精确的结果类型取决于字符串文字本身的类型 - “narrow”字面值为std::string,u16字面值为u16string,u32字面值为u32string 。哦,是的,如果你坚持使用一个宽字符串文字,它将产生一个wstring

请注意,s后缀也用于表示秒(在<chrono>中定义),但两者之间没有真正的冲突 - 字符串文字上的s表示字符串,数字上的s表示秒数。