对于std :: string使用operator []是否安全

use*_*183 3 c++ language-lawyer

我正在与旧的C风格界面作斗争.我有一个像这样的签名功能:

 /// if return_value == NULL only the length is returned
 void f( char * return_value, size_t * size_only_known_at_runtime); 
Run Code Online (Sandbox Code Playgroud)

我的问题是,以下代码是否安全?

std::size required;
f( NULL, &required );
std::string s;
s.resize(required);
f( &s[0], &required );
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法将数据输入字符串?

Bar*_*rry 7

是的,它是安全的,至少从C++ 11中是明确的.来自[string.require],强调我的:

对象中的char状basic_string对象应连续存储.也就是说,任何basic_string的对象S,身份&*(s.begin() + n) == &*s.begin() + n应持的所有值n这样0 <= n < s.size().

这是DR 530的解决方案.在C++ 11之前,这在标准中并不明确,尽管无论如何它都是在实践中完成的.

在C++ 14中,此要求已移至[basic.string]:

A basic_string是一个连续的容器(23.2.1).

where [container.requirements.general]:

邻接容器是支持随机访问迭代器(24.2.7)和其成员类型的容器iteratorconst_iterator是邻接的迭代器(24.2.1).

其中[iterator.requirements.general]:

迭代器进一步满足要求,即,对于整数值n和提领迭代值 a(a + n),*(a + n)相当于*(addressof(*a) + n)被称为连续的迭代器.

  • @MicroVirus否.不等式是`<s.size()`,而不是`<=`.(虽然在实践中,是的,不确定如何实现一个常量时间`c_str()`否则) (2认同)
  • @ComicSansMS那个是`const`.你可能会对`std :: vector`感到困惑,它有一个``data()`的非`constst`版本. (2认同)