sbi*_*sbi 22 c++ language-lawyer c++11 c++14 c++17
我知道在C++ 98中,既不需要std::basic_string<>也不std::vector<>需要使用连续存储.std::vector<>一旦被指出,这被视为疏忽,如果我没记错的话,用C++ 03修复.
我似乎记得std::basic_string<>在C++ 11仍然被称为C++ 0x时读过有关需要使用连续存储的讨论,但我当时没有密切关注讨论,并且仍然局限于C++ 03的工作所以我不确定它是什么.
那么是否std::basic_string<>需要使用连续存储?(如果是这样,那么标准的哪个版本首先需要它?)
如果您想知道:如果您将代码传递&str[0]给期望连续写入内存的函数,则这很重要.(我知道str.data(),但由于显而易见的原因,旧代码不使用它.)
Nat*_*ica 15
在c ++ 03中,无法保证字符串的元素会被连续存储.[basic.string]是
- 对于类似char的类型charT,类模板basic_string描述了可以存储由不同数量的任意类似char的对象组成的序列的对象(第21节).序列的第一个元素位于零位.如果给定的类似char的类型从上下文中清楚,则这样的序列也称为"字符串".在本节的其余部分中,charT表示类似于char的类型.通过作为模板参数传递的Allocator类,通过类basic_string的成员函数根据需要分配和释放字符串的存储.Allocator :: value_type应与charT相同.
- 类模板basic_string符合Sequence的要求,如(23.1.1)中所述.此外,因为通过basic_string的支持的迭代器是随机访问迭代(24.1.5),basic_string的符合一可逆容器的要求,如在(23.1)中指定.389 ISO/IEC 14882:2003(E)ISO/IEC 21.3类模板basic_string的21串库
- 在所有情况下,size()<= capacity().
然后在C++ 17中他们也改变了它
- 类模板basic_string的描述可以存储在零位置由不同数量的与所述序列的第一个元素的任意字符状物体的序列的对象.这样的序列也被称为"弦",如果它持有该炭状物体的类型是根据上下文清楚.在该条款的其余部分,在一个basic_string的对象保持的焦炭状的对象的类型是由图表表示.
- basic_string的成员函数使用作为模板参数传递的分配器类的一个对象来分配和释放用于存储所包含的焦炭状objects.233
- basic_string是一个连续的容器(23.2.1).
- 在所有情况下,size()<= capacity().
强调我的
所以预先C++ 17它不能保证,但现在它是.
由于std::string::data调用std::string::data会在字符串中为您提供连续的字符数组,因此强制执行此非保证的约束几乎没有实际意义.因此,除非实现按需执行此操作,并且在恒定时间内字符串将是连续的.
如果您想知道:如果您将代码传递
&str[0]给期望连续写入内存的函数,则这很重要.(我知道str.data(),但由于显而易见的原因,旧代码不使用它.)
行为operator[]也发生了变化.在C++ 03中我们有
返回:如果pos <size(),则返回data()[pos].否则,如果pos == size(),则const版本返回charT().否则,行为未定义.
因此,const如果您尝试&s[0]何时s为空,则只保证版本具有已定义的行为.在C++ 11中,他们将其更改为:
如果pos <size(),则返回:*(begin()+ pos).否则,返回对charT类型的对象的引用,其值为charT(),其中修改对象会导致未定义的行为.
所以现在无论是const和非const的版本已经定义的行为,如果你尝试&s[0]时s是空的.
| 归档时间: |
|
| 查看次数: |
3186 次 |
| 最近记录: |