NoS*_*tAl 7 c++ string-view c++20
我已经阅读了一些问题和文档,我想答案是肯定的,因为string_view永远不会接触所指向的东西,但我仍然有点困惑这是否合法:
std::vector<char> v;
std::string_view sv(v.data(), v.size());
Run Code Online (Sandbox Code Playgroud)
笔记:
v.data()和执行的构造函数strlen
会崩溃,我正在询问这种特殊的构造方式
std::string_view。string_view是“邪恶的”,例如做std::cout << sv.data()是UB,但我认为std::cout << sv;应该有效完整示例:
#include <vector>
#include <iostream>
#include <string_view>
std::vector<char> v;
auto get_sv() {
std::string_view sv(v.data(), v.size());
return sv;
}
int main() {
std::cout << "|" << get_sv() << "|" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来完全合法。
根据basic_string_view( const CharT* s, size_type count );
- 构造从 s 指向的元素开始的字符数组的前 count 个字符的视图。
返回指向用作元素存储的底层数组的指针。该指针的范围为 [data(); data() + size()) 始终是有效范围,即使容器为空(在这种情况下 data() 不可取消引用)。
和
如果size
() 为 0,则 data() 可能会也可能不会返回空指针。
因此,根据实现的不同,底层 char 数组在打印时存在,或者是string_view使用nullptr. 无论哪种情况,它都是有效范围。