递增 std::string::end() 迭代器是否未定义?

jos*_*atv 6 c++

增加 a 的end迭代器std::string以在范围中包含空终止符是否“合法” ?

例如

std::string my_text{"Arbitrary string"};
std::vector<std::uint8_t> my_collection{};
my_collection.insert(my_collection.end(), std::begin(my_text), std::next(std::end(my_text)));
Run Code Online (Sandbox Code Playgroud)

我问的原因是我只想避免my_text.c_str() + my_text.size()(或者是my_text.size()+1?)中涉及的指针算术。

我有理由相信今天的大多数实现都会按预期运行。尽管如此,对于我们中间的语言律师来说,包括 C++-legalese 的答案还是值得赞赏的。只要我在 C++ 法庭上,我就有一个严密的防御。

ger*_*rum 0

我希望增加结束迭代器意味着未定义的行为,但我没有找到参考。

但我有一个参考,即 end 的取消引用是未定义的行为: https ://en.cppreference.com/w/cpp/string/basic_string/end

因此,该标准并不能确保您这样做会发生预期的情况。

  • 我并不是说不要使用它,只是不能将 cpprefererence 称为标准。事实并非如此。这是一个参考网站。如果您说*所以标准...*,您应该引用标准来支持这一点。 (4认同)
  • FWIW,cppreference 不是*标准*。这可能是错误的,而且以前也曾经是错误的。 (2认同)