从 std::string_view 创建 std::string

Creating a std::string from std::string_view

给定一个 string_view sv 和一个 string s(sv)s 是否在内部使用与 sv 相同的字符数组?可以说当 s 被销毁时, sv 仍然有效吗?

创建一个 std::string 对象 总是 复制(或移动,如果可以的话)字符串,并在内部处理它自己的内存。

对于您的示例,svs 处理的字符串完全不同且独立。

就运行这个演示程序。

#include <iostream>
#include <string>
#inc,lude <string_view>

int main()
{
    const char *s = "Hello World!";

    std::cout << "The address of the string literal is "
        << static_cast< const void * >( s ) << '\n';

    std::string_view sv( s );

    std::cout << "The address of the object of the type std::string_view is "
        << static_cast< const void * >( sv.data() ) << '\n';

    std::string ss( sv );

    std::cout << "The address of the string is "
        << static_cast< const void * >( ss.data() ) << '\n';
}

它的输出可能看起来像

The address of the string literal is 00694E6C
The address of the object of the type std::string_view is 00694E6C
The address of the string is 0133F7C0

可以看出,字符串字面量的地址与std::string_view对象的数据成员data返回的内存地址相同。

也就是说 class std::string_view 只是带下划线的引用对象的包装。

至于 class std::string 然后它创建一个通常存储在分配的内存中的字符串的副本。

例如,您不能更改 std::string_view 类型的对象,但 std::string 是专门设计用于处理存储的字符串。

class名称std::string_view中的后缀view表示只能查看std::string_view类型的对象所引用的带下划线的对象。