依赖于一个空的std :: string的索引0是不是很糟糕?

std::string my_string = ""; char test = my_string[0]; 

我注意到,这不会崩溃,每次我testing它,testing是0。

我可以依靠它总是0吗? 或者是任意的?

这是不好的编程?

编辑:从一些评论,我收集到,这是有用的误解。

这样做的目的不是检查string是否为空。 这是不需要检查string是否为空。

情况是,有一个string可能会或可能不是空的。 我只关心这个string的第一个字符(如果它不是空的)。

在我看来,检查一下string是否为空是非常有效的,如果不是空的话,看第一个字符。

 if (! my_string.empty()) test = my_string[0]; else test = 0; 

相反,我可以只看第一个字符而不需要检查string是否为空。

 test = my_string[0]; 

C ++ 14

没有; 你可以依靠它。

21.4.5.2 (或[string.access])中我们可以find:

如果pos < size()则返回*(begin() + pos) pos < size() 。 否则,返回一个charT()types的对象的引用,其中修改对象导致未定义的行为。

换句话说,当pos == size() (当它们都是0时都是true)时,运算符将返回一个对你禁止修改缺省构造字符types的引用。

对于空的(或0尺寸的)string不是特别的,对于每一个长度都是相同的。


C ++ 03

最肯定的是 C ++ 98。

这取决于。

这里是来自官方ISO / IEC 14882的21.3.4.1

返回:如果pos < size() ,则返回data()[pos] 。 否则,如果pos == size() ,const版本返回charT() 。 否则,行为是不确定的。

@Bartek Banachewicz的答案解释了哪些情况可以让你做出自己的假设。 我想补充一点

这是糟糕的编程。

为什么? 有几个原因:

  1. 你必须成为一名语言律师,以确保这不是一个错误。 我不知道答案,如果不是这个网页,坦率地说 – 我不认为你真的应该知道这两者。
  2. 没有string直觉的人是一个以空字符结尾的字符序列,直到他们阅读标准或询问他们的朋友之前,你都不知道你要做什么。
  3. 以不好的方式打破最不可思议的原则 。
  4. 违背“写你的意思”的原则,即让代码expression问题领域的概念。
  5. 一个幻数的使用(在这种情况下0是否构成一个幻数是有争议的)。

我可以继续吗? …我99%肯定你几乎在每个方面都有另一个优越的地位。 我甚至有66%相信你已经做了一些“坏”的事情来操纵自己想要做到这一点。

永远记住: 其他人,谁不会咨询你,迟早需要维护这个代码。 想想他们,不仅仅是你自己,谁能想出来。 另外,十年后的今天,谁能说你会记住自己的诡计呢? 你可能是那个混乱的维护者