在C++11标准的兼容性附录中,C++03到C++11的变化之一描述如下:
C.2.11 第 21 条:字符串库
21.4.1
Change: 放宽 basic_string 失效规则
基本原理:允许小字符串优化。
对原始特征的影响:可以执行有效的 C++ 2003 代码
本国际标准有所不同。一些常量成员
函数(例如 data 和 c_str)不再使迭代器无效。
迭代器失效规则std::string
确实从 C++03 更改为 C++11data()
and c_str()
不再允许使迭代器无效,但我不知道这如何导致“allow small-string optimization
“?在 C++11 之前不是已经允许 SSO 了吗?
其中两个区别是std::string
在我发现兼容性附录中的 SSO 注释之前,我所知道的 C++11 和 C++03 之间的关系是:
- C++11 中保证元素连续存储
- COW 实现不是 C++11 中的一个选项(某些操作,例如
operator[]
不允许使迭代器无效)
我采用了 C++11 的非无效保证c_str()
and data()
这是向连续存储转变的直接结果。现在看来和SSO的实现有一些联系,我想了解一下幕后逻辑的细节。谢谢。
我相信您误解了“更改”:这并不是指无效规则data
and c_str
,而是那些swap
.
这个问题给了我这个想法,当我阅读您的引言和链接的问题/答案时,我认为我是正确的。
Since basic_string
的交换可以使迭代器无效,可以实现 SSO。在 C++03 中,basic_string
是一个可翻转的容器,这意味着它必须符合这一要求swap
ping 容器:
对于除数组之外的标准容器类型的容器 a 和 b,表达式 a.swap(b) 应交换 a 和 b 的值,而不对各个容器元素调用任何移动、复制或交换操作。
不过,我可能大错特错了,IANALL(我不是语言律师)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)