gpt4 book ai didi

c++ - std::string 最终会成为我们的编译时字符串吗?

转载 作者:行者123 更新时间:2023-12-01 14:08:05 29 4
gpt4 key购买 nike

许多开发人员和库作者多年来一直在为编译时字符串苦苦挣扎——作为标准(库)字符串,std::string ,需要动态内存分配,而不是 constexpr。

所以我们有很多关于如何正确获取编译时字符串的问题和博客文章:

  • Conveniently Declaring Compile-Time Strings in C++
  • Concatenate compile-time strings in a template at compile time?
  • C++ Compile-Time string manipulation
  • (场外)Compile-time strings with constexpr

  • 我们现在了解到, new 不仅是可用 constexpr代码,允许在编译时动态分配,但实际上, std::string will become constexpr in C++20 (Herb Sutter 的 C++ 标准工作组 session 报告)。

    这是否意味着对于 C++20 及更高版本的代码,我们应该抛弃所有那些漂亮的编译时字符串实现,而总是使用 std::string ?

    如果不是 - 我们什么时候会这样做,我们什么时候会坚持今天的可能性(当然除了向后兼容的代码)?

    注意:我不是在谈论内容是其类型的一部分的字符串,即不是在谈论 std::integral_constant 的等价物。 ;那绝对不会是 std::string .

    最佳答案

    这取决于您所说的“constexpr string”是什么意思。
    C++20 允许你做的是使用 std::string在标记为 constexpr 的函数中(或 consteval )。这样的函数可以创建一个string ,操纵它,等等,就像任何文字类型一样。但是,该字符串不能泄漏到非 constexpr代码;这将是一个非 transient 分配,是被禁止的。
    问题是,您提供的所有示例都是尝试使用字符串作为模板参数。这是一个相似但又不同的事情。您不只是在谈论在编译时构建字符串;你现在想用它来实例化一个模板。
    C++20 通过允许用户定义的类型作为模板参数解决了这个问题。但是对这种类型的要求比仅仅作为文字类型要严格得多。类型必须有 no non-public data members and the only members are of types that follow those restrictions .基本上,编译器需要知道其数据成员的逐字节比较代表一个等效值。甚至是 constexpr -有能力std::string不能那样工作。
    但是std::array<char, N>可以做到这一点。如果你在 constexpr代码,调用constexpr返回 std::string 的函数, 并将该字符串存储在 constexpr值,然后 string::size()constexpr功能。所以你可以用它来填写N为您的阵列。
    将字符复制到 constexpr array (因为它是 constexpr 值,所以它是不可变的)涉及更多,但它是可行的。
    所以 C++20 解决了这些问题,而不是(直接)使用 std::string .

    关于c++ - std::string 最终会成为我们的编译时字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62852558/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com