11

一个简单的问题:为什么 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 中吗?

4

1 回答 1

20

用户定义的文字在 C++11 中足够新,因此不包括在内,但它在 C++14 中(在 §21.7 中,以防有人关心)。是的,它s用作后缀。精确的结果类型取决于字符串文字本身的类型——“窄”文字给出 an std::string,u16 文字给出 a u16string,u32 文字给出 a u32string。哦,是的,如果你坚持使用宽字符串文字,它会产生一个wstring.

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

于 2014-02-26T06:27:45.423 回答