因此,
但是
忽略上面在
明确一下:
据我所知,如果从未调用
在调用
operator[]
并没有直接说明s[s.size()]
必须是s[s.size()-1]
后面的字符。看起来这样措辞是为了避免这种说法。但是
s.data()
表明s.data()+k == &s[k]
,而且s.data()
必须返回一个指针。忽略上面在
CharT
上使用&
而不是std::addressof
似乎是标准缺陷的问题,那么实现是否可以在第一次调用s.data()
之前为s[s.size()]
返回一个不同的CharT
(比如在受保护的页或ROM中)?(显然它可以安排缓冲区在只读页面上以及带有零的页面上结束;我谈论的是不同的情况)明确一下:
据我所知,如果从未调用
s.data()
(并且编译器可以证明它),则s[s.size()]
不需要与缓冲区的其余部分连续。在调用
s.data()
后,std::addressof(s[s.size()])
是否可以更改,并且实现是否符合标准(只要s.data()+k == &s[k]
在[]
之前评估.data()
,但编译器可以强制执行)。还是有我看不到的不可变性要求?
operator[]
的行为与您对data()
描述的完全相同。但是它还提到,这个字符不能被修改。 - SergeyAbasic_string
,从索引跳转到它,然后从那里搜索operator[
和data(
)。我想知道是否有其他限制我错过了(就像我最初错过了对s[s.size()]
的.data()
暗示限制一样)。大多数明显的限制(基于迭代器)不适用,因为*s.end()
仍然是未定义行为。 - Yakk - Adam Nevraumonts[s.size()]
是良好定义的而不是UB?毕竟,它已经超出了字符串的末尾,并且对于任何其他容器来说都将是UB。作为实际问题,每个实现可能都会保留c_str()
所需的终止空值,因此这可能是一个无意义的问题。 - Mark Ransomoperator[]
的定义中有说明。它必须返回一个CharT
引用(根据情况可以是 const 或非 const),其值等于CharT()
。修改它将导致未定义行为。正是对保护该空终止符的思考引发了上述问题。 - Yakk - Adam Nevraumont