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的前提:
期望:
pos <= size()
。返回:
*(begin() + pos) if pos < size()
。否则(因此,这里唯一可行的可能性是
pos == size()
)返回对charT
带有值charT()
(即'\0'
)的类型的对象的引用,其中将对象修改为除charT()
导致未定义行为之外的任何值。
str[str.size()]
基本上指向空终止符。您可以读写,但只能写入一个'\0'
。