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)
有没有更好的方法将数据输入字符串?
是的,它是安全的,至少从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)和其成员类型的容器
iterator和const_iterator是邻接的迭代器(24.2.1).
其中[iterator.requirements.general]:
迭代器进一步满足要求,即,对于整数值
n和提领迭代值a和(a + n),*(a + n)相当于*(addressof(*a) + n)被称为连续的迭代器.