访问std :: string中的元素,其中string的位置大于其大小

cpp*_*ast 36 c++ string language-lawyer c++11

在std :: string的情况下,如果我们访问一个元素,其中(element position) == (size of string)标准表示该元素返回对charT具有value 类型的对象的引用charT()

const_reference operator[](size_type pos) const;
reference       operator[](size_type pos);
Run Code Online (Sandbox Code Playgroud)

期望:pos <= size()。

如果pos <size(),则返回*(begin()+ pos)。否则,返回对具有值charT()的charT类型的对象的引用,在该引用中,将该对象修改为charT()以外的任何值都将导致未定义的行为。

http://eel.is/c++draft/strings#string.access-1

不幸的是,我无法对此做出解释,如果它是Undefined Behavior,那就更好了。

有人可以解释其背后的原理吗?

for*_*818 39

您必须考虑完整的规格。

首先:

期望:pos <= size()。

如果您不遵循前提条件,则无论如何您都有未定义的行为。现在...

如果pos <size(),则返回*(begin()+ pos)。否则,返回对具有值charT()的charT类型的对象的引用,在该引用中,将该对象修改为charT()以外的任何值都将导致未定义的行为。

“否则”所指的唯一(有效)情况是when pos == size()。这可能是为了模拟具有some_string[size]可访问元素的c字符串行为。请注意,charT()通常只是'\0'

PS:有人可能认为要实施该规范,operator[]必须检查是否pos == size。但是,如果基础字符数组charT()在字符串的末尾带有a ,则基本上可以免费获得所描述的行为。因此,实际上与对数组的“常规”访问有所不同。


rus*_*tyx 22

陈述1是陈述2的前提:

  1. 期望:pos <= size()

  2. 返回:*(begin() + pos) if pos < size()

    否则(因此,这里唯一可行的可能性是pos == size())返回对charT带有值charT()'\0')的类型的对象的引用,其中将对象修改为除charT()导致未定义行为之外的任何值。

str[str.size()]基本上指向空终止符。您可以读写,但只能写入一个'\0'


Yol*_*ola 15

运算符期望pos小于或等于size(),因此,如果不小于,则期望等于。