【发布时间】:2021-12-17 23:30:06
【问题描述】:
让我们给出任何包含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 标准是否保证这些容器存储类 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());
【问题讨论】:
-
你至少试过了吗?它会给你的问题增加更多的“重量”。因为你可以说“我试过了,看起来它有效,但我仍然不确定它是否正确和/或安全。”这比“这是一些我懒得自己运行的代码。可以吗?”
-
在具有“未定义行为”概念的语言(如 C++)中,尝试并不是确定预期行为或代码正确性的好方法。 @sweenish
-
@CodyGray 我觉得你并没有真正阅读我的评论。
-
@sweenish 我没有得到 OP 没有尝试运行代码的印象。对我来说,“它是否由 cpp 标准保证” 和 “它是否安全” 意味着他们尝试并获得了预期的行为。如果他们不尝试,他们可能只会问“那些 string_views 是否为空终止”,而没有提及标准。
-
不,我不希望 C 或 C++ 程序员通过实验来学习。这会导致错误的代码和误解,这让我头疼不已。我宁愿他们查阅标准、值得信赖的参考资料,或者询问知道的人。
标签: c++ c++17 string-view