在C++中,11 basic_string::c_str被定义为完全相同basic_string::data,而后者又定义为*(begin() + n)和*(&*begin() + n)(when 0 <= n < size())完全相同.
我找不到任何要求字符串在其末尾始终具有空字符的内容.
这是否意味着c_str()不再保证生成以null结尾的字符串?
下面的字符串是否包含空终止符'\ 0'?
std::string temp = "hello whats up";
Run Code Online (Sandbox Code Playgroud)
谢谢!:)
在他的网站2008年的一篇文章中,Herb Sutter声明如下:
由于与并发相关的原因,有一个积极的建议是在C++ 0x中进一步加强这一点并且需要空终止并且可能禁止写时复制实现.以下是该文件:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html.我认为本文中的一个或两个提案很可能会被采纳,但我们将在下一个或两个会议上看到.
我知道C++ 11现在保证std :: string内容连续存储,但他们是否在最终草案中采用了上述内容?
现在使用类似的东西会安全&str[0]吗?
我见过多次std::string::operator[]不做任何边界检查.甚至string :: at和string :: operator []之间有什么区别?,在2013年询问,答案说operator[]不做任何边界检查.
我的问题是,如果我在[string.access]中查看标准(在本例中为草案N3797)
Run Code Online (Sandbox Code Playgroud)const_reference operator[](size_type pos) const; reference operator[](size_type pos);
- 要求:
pos <= size().- 返回:
*(begin() + pos)ifpos < size().否则,返回对charT具有value 的类型对象的引用charT(),其中修改对象会导致未定义的行为.- 投掷:没什么.
- 复杂性:恒定时间.
这使我相信operator[]必须进行某种边界检查以确定它是否需要返回字符串的元素或默认值charT.这个假设是否正确,operator[]现在需要进行边界检查?
std::string.c_str()返回一个(const char*)值.我用Google搜索,发现我可以执行以下操作:
std::string myString = "Hello World";
char *buf = &myString[0];
Run Code Online (Sandbox Code Playgroud)
这怎么可能?&myString[0]是一个类型的对象std::string,那么它如何工作?