def*_*ode 33 c++ standards c++11
Vector的新方法data()提供了const和非const版本.
但是string的data()方法只提供const版本.
我认为他们改变了措辞,std::string以便现在要求chars连续(比如std::vector).
当时std::string::data只是错过了什么?或者是一个很好的理由只允许const访问字符串的底层字符?
注意:std::vector::data有另一个很好的功能,调用data()空向量不是未定义的行为.尽管&vec.front()是不确定的行为,如果它是空的.
How*_*ant 30
在C++ 98/03中,data()由于字符串经常被实现为COW这一事实,因此有充分的理由没有非const .data()如果refcount大于1,非const 将需要复制.尽管可能,这在C++ 98/03中并不理想.
在2005年10月该委员会在投票LWG 464里面添加的常量和非const data()来vector,并添加常量和非const at()来map.当时,string没有改变以便取消COW.但后来,通过C++ 11,COW string不再符合要求.该string规范也在收紧C++ 11,使得其需要是连续的,并且总有通过暴露一个空结尾operator[](size()).在C++ 03中,终止null只能由const重载保证operator[].
所以简而言之,data()对于C++ 11来说,非const 看起来更合理string.据我所知,从未提出过.
更新
charT* data() noexcept;
Run Code Online (Sandbox Code Playgroud)
加入basic_string在C++ 1Z工作N4582草案由大卫Sankel的P0272R1在2月份2016年杰克逊维尔会议.
干得好大卫!