【问题标题】:Why no standard-defined literal suffix for std::string?为什么 std::string 没有标准定义的文字后缀?
【发布时间】:2014-02-26 06:21:27
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好吧,我们开始了,几秒钟内就能得到完美答案,+1(如果可以的话,还可以更多)。奇怪的是它不是原始 UDL 提案的一部分,但我们开始了。我期待最终(希望)在 C++14 中摆脱 char* 的诅咒!
    • 我很乐意将它与auto结合使用
    • @Excelcius:比auto(至少IMO)更重要的是简单地在表达式中,例如将字符串加在一起:例如"A"s + "B"s
    • @JerryCoffin:在我看来你正在添加 As 和 Bs:p
    • @MatthieuM.: 所以我是(或者至少是 A 和 B)。
    猜你喜欢
    • 2021-05-13
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多