string_view 的容器 - 它们总是以 null 结尾吗?

container of string_view's - are they always null-terminated?

让我们给出包含std::string_view对象的任何数据结构:

std::vector<std::string_view> v{ "abc", "def" };
std::deque<std::string_view> d{ "abc", "def" };
std::set<std::string_view> s{ "abc", "def" };

cpp 标准是否保证这些容器存储 class std::string_view 的对象,这些对象指向以 null 结尾的字符串文字?

我的意思是这样写代码安全吗:

void foo(const char* ptr) {
    printf("%s", ptr);
}

for (auto elem : v)
    foo(elem.data());

for (auto elem : d)
    foo(elem.data());

for (auto elem : s)
    foo(elem.data());

是的,这是安全的。

通常 std::string_views 不必以 null 结尾,但在这里您使用以 null 结尾的字符串显式初始化它们。

不允许编译器仅基于将字符串分配给 string_view.

从字符串中删除空终止符

唯一允许这样做的情况是它没有改变程序行为(as-if rule),这意味着您无需担心它。