假设字符串的容量大于它的大小。
我可以在 std::string::end()
和 std::string::capacity()
之间使用(读/写)缓冲区吗?
更新。我问不关于改变 end()
位置本身的尾随 \0
。
最佳答案
如果您想保持 std::string
的不变性,则不能这样做。有几种方法可以从 std::string
本身获取数据,但没有一种方法可以让您合法访问“死角”。 std::string::operator[]
仅对 [0, size()]
有效,因此您不能使用它。 std::string::at
仅对 [0, size() - 1]
有效,因此您也不能使用它。您可以使用 data()/c_str()
获取指向数据的指针,但像 operator[]
一样,访问 [0, size() 是合法的]
。
您可以合法地使用获取整个缓冲区指针的唯一方法是使用 &string_var[0]
然后您可以写入 [&string_var[0] 中的任何索引, &string_var[0] + capacity())
.这可能会导致问题。在 string[size()]
中,我们保证有一个空终止符,如果您覆盖它,您将破坏 std::strings 不变量,这是未定义的行为,所有的赌注都关闭了。我们也不保证您放入该空间的任何东西都会留在那里。因为你不应该在那个空间玩 std::string
被允许在那里做任何它想做的事情。它可以将它用作事物本身的缓冲区,并可能会覆盖您的数据,或者假定存在的就是它放在那里的,然后您又破坏了它的不变性。
长话短说:是的,你可以,但你真的不应该。
关于c++ - 在 std::string::end() 和 std::string::capacity() 之间使用缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58323311/