从 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
对象 总是 复制(或移动,如果可以的话)字符串,并在内部处理它自己的内存。
对于您的示例,sv
和 s
处理的字符串完全不同且独立。
就运行这个演示程序。
#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
类型的对象所引用的带下划线的对象。
给定一个 string_view sv
和一个 string s(sv)
,s
是否在内部使用与 sv
相同的字符数组?可以说当 s
被销毁时, sv
仍然有效吗?
创建一个 std::string
对象 总是 复制(或移动,如果可以的话)字符串,并在内部处理它自己的内存。
对于您的示例,sv
和 s
处理的字符串完全不同且独立。
就运行这个演示程序。
#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
类型的对象所引用的带下划线的对象。