代码之家  ›  专栏  ›  技术社区  ›  L. F.

为什么sv后缀引入的字符串没有过期?

  •  2
  • L. F.  · 技术社区  · 5 年前

    初始化文件是一个常见的错误 std::string_view 临时的 std::string .

    using namespace std::literals;
    
    std::string_view sv1 = "foo" ; // good
    std::string_view sv2 = "bar"s; // bad: "foo"s will expire
    
    std::cout << sv1 << "\n"       // outputs foo
              << sv2 << "\n";      // undefined behavior
    

    那是因为 "bar"s 充分表达 .

    但是你呢 "foo"sv ?

    std::string_view sv3 = "baz"sv;
    

    当然这应该管用,因为后缀 sv "baz"s ? 换句话说,为什么 "baz"sv 不过期?

    1 回复  |  直到 5 年前
        1
  •  7
  •   L. F.    5 年前

    为什么要宣布 sv2

    [basic.string.literals]/1 :

    string operator""s(const char* str, size_t len);
    

    string{str, len} .

    "foo"s ,字符串文本 "foo" 用于初始化临时 std::string . 字符被复制到临时 标准::字符串 std::string_view 是非所有者视图,并且 标准::字符串 . 在临时 被摧毁了, 一直指向(现在过期的)底层数组,并尝试输出 导致未定义的行为。

    sv3 很好

    [string.view.literals]/1

    constexpr string_view operator""sv(const char* str, size_t len) noexcept;
    

    退货: string_­view{str, len}

    因此 sv3型 相当于: 1.

    std::string_view sv3{"baz", 3};
    

    sv3型 直接指向字符串文字 "baz" . 字符串文字具有静态存储持续时间,不会过期。

    1. may may not string_view 是非拥有的,复制的 s不引入新的临时字符串。因此,无论是否要进行复制,复制的状态 sv3型 是一样的。

    推荐文章