从空向量构造 std::string_view 是否合法?

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)

笔记:

  1. 我知道仅使用v.data()和执行的构造函数strlen 会崩溃,我正在询问这种特殊的构造方式 std::string_view
  2. 我知道构造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)

Ola*_*che 4

这对我来说看起来完全合法。

根据basic_string_view( const CharT* s, size_type count );

  1. 构造从 s 指向的元素开始的字符数组的前 count 个字符的视图。

std::vector::data()指出:

返回指向用作元素存储的底层数组的指针。该指针的范围为 [data(); data() + size()) 始终是有效范围,即使容器为空(在这种情况下 data() 不可取消引用)。

如果size
() 为 0,则 data() 可能会也可能不会返回空指针。

因此,根据实现的不同,底层 char 数组在打印时存在,或者是string_view使用nullptr. 无论哪种情况,它都是有效范围。