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

Why no standard-defined literal suffix for std::string?

本文关键字:文字 后缀 定义 std string 为什么 标准      更新时间:2023-10-16

一个简单的问题:为什么C++11不提供"user-"(实际上是标准库)定义的文字来创建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吗?

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

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