依赖于一个空的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的答案解释了哪些情况可以让你做出自己的假设。 我想补充一点
这是糟糕的编程。
为什么? 有几个原因:
- 你必须成为一名语言律师,以确保这不是一个错误。 我不知道答案,如果不是这个网页,坦率地说 – 我不认为你真的应该知道这两者。
- 没有string直觉的人是一个以空字符结尾的字符序列,直到他们阅读标准或询问他们的朋友之前,你都不知道你要做什么。
- 以不好的方式打破最不可思议的原则 。
- 违背“写你的意思”的原则,即让代码expression问题领域的概念。
- 一个幻数的使用(在这种情况下0是否构成一个幻数是有争议的)。
我可以继续吗? …我99%肯定你几乎在每个方面都有另一个优越的地位。 我甚至有66%相信你已经做了一些“坏”的事情来操纵自己想要做到这一点。
永远记住: 其他人,谁不会咨询你,迟早需要维护这个代码。 想想他们,不仅仅是你自己,谁能想出来。 另外,十年后的今天,谁能说你会记住自己的诡计呢? 你可能是那个混乱的维护者