Yak*_*ont 8 c++ stdstring language-lawyer c++14 c++17
所以,operator[]不直接说s[s.size()]必须是s[s.size()-1]内存之后的人物.似乎措辞是为了避免提出这种说法.
但是s.data()说s.data()+k == &s[k],并且s.data()必须返回一个指针.
忽略&在CharT上面使用而不是上面使用的看似标准缺陷,std::addressof实现CharT是否s[s.size()]可以在第一次调用之前自由地返回不同的(例如,在受保护的页面上,或在ROM中)s.data()?(显然,它可以将缓冲区安排在一个只读的页面上结束;我说的是另一种情况)
要明确:
据我所知,如果s.data()永远不会被调用(并且编译器可以证明它),那么s[s.size()]就不需要与缓冲区的其余部分连续.
可以在调用之后进行std::addressof(s[s.size()]) 更改,s.data()并且实现符合标准(只要之前s.data()+k == &s[k]已经过.data()评估[],但编译器可以自由执行).或者是否有我看不到的不变性要求?
从 C++11 开始,std::string 需要存储在连续的内存中。这是 C++11 标准(第 24.4.1.4 节)的引用:
basic_string 对象中的类字符对象应连续存储。也就是说,对于任何 basic_string 对象 s ,恒等式 &*(s.begin() + n) == &*s.begin() + n 对于所有 n 值都成立,使得 0 <= n < s.size ()。
&*(s.begin()+n)关于operator[]返回值的这段引用指出它的返回值与(第21.4.5.1节)相同:
*(begin() + pos) 如果 pos < size() 。否则,返回对值为 charT() 的 charT 类型对象的引用,其中修改该对象会导致未定义的行为
然后我们在(第 24.4.7.1 节)中引用了 data() 的返回值:
一个指针 p,对于 [0,size()] 中的每个 i,p + i == &operator[](i) 。
因此数据返回与使用 &operator[] 得到的数据相同。使用 & 运算符检索之间的任何值都应连续存储。所以你可以得出结论,两者都返回一个指向连续内存的指针。因此它不会返回指向距离页的指针。
请注意,这仅适用于 C++11。C++11 之前的标准并未做出此类保证。
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |