std::string
的字符必须被存储为连续的,正如§21.4.1/5所指出的:
然而,这里是§21.4.7.1列出的两个函数来检索指向底层存储的指针(重点在于我):一个 basic_string 对象内的类 char 对象应被作连续存储。也就是说,对于任意一个 basic_string 对象 s,在所有满足 0 <= n < s.size() 的 n 值上都有 &*(s.begin() + n) == &*s.begin() + n.
我能想到的关于第三点的一个可能性是,该指针可以因对象的以下用途而无效(§21.4.1/6):const charT *c_str() const noexcept;
const charT *data() const noexcept;
1 返回:一个指针 p,使得对于每个 i 在 [0,size()] 中,p + i == &operator[](i).
2 复杂度:常数时间。
3 要求:程序不得更改存储在字符数组中的任何值。
- 作为任何标准库函数的参数,这些函数将非 const basic_string 的引用作为参数。
- 调用非 const 成员函数,除了 operator[]、at、front、back、begin、rbegin、end 和 rend。
为什么不能直接写入该缓冲区?是因为这会将类置于不一致的状态中,例如,
end()
将无法随新末尾更新吗?如果是这样,为什么可以直接写入像 std::vector
这样的东西的缓冲区呢?这样做的用例包括能够将
std::string
的缓冲区传递给 C 接口以检索字符串,而不是传递一个 vector<char>
并使用该向量的迭代器初始化字符串:std::string text;
text.resize(GetTextLength());
GetText(text.data());
GetText(text.data(), text.size());
:P - Nawazlength + 1
,但我决定不仅仅为了这个而去编辑它。 - chris