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_view
s 不必以 null 结尾,但在这里您使用以 null 结尾的字符串显式初始化它们。
不允许编译器仅基于将字符串分配给 string_view
.
从字符串中删除空终止符
唯一允许这样做的情况是它没有改变程序行为(as-if rule),这意味着您无需担心它。
让我们给出包含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_view
s 不必以 null 结尾,但在这里您使用以 null 结尾的字符串显式初始化它们。
不允许编译器仅基于将字符串分配给 string_view
.
唯一允许这样做的情况是它没有改变程序行为(as-if rule),这意味着您无需担心它。