std::string my_string = "";
char test = my_string[0];
我注意到这并没有崩溃,每次我测试它时,测试都是0。
我可以依赖它永远为0吗?还是随意的?
这是不好的编程?
编辑: 从一些评论中,我认为对此的有用性存在一些误解。
这样做的目的不是检查字符串是否为空。 不需要检查字符串是否为空。
情况是有一个字符串可能是空的,也可能不是。 我只关心这个字符串的第一个字符(如果它不是空的)。
在我看来,查看字符串是否为空是没有效率的,然后,如果它不是空的,请查看第一个字符。
if (! my_string.empty())
test = my_string[0];
else
test = 0;
相反,我只需要查看第一个字符,而无需检查字符串是否为空。
test = my_string[0];
答案 0 :(得分:69)
否;你可以依靠它。
在 21.4.5.2 (或[string.access])中,我们可以找到:
如果
*(begin() + pos)
,则返回pos < size()
。否则,返回对值为charT
的{{1}}类型的对象的引用,其中修改对象会导致未定义的行为。
换句话说,当charT()
(两者都为0时为真)时,运算符将返回对默认构造的字符类型的引用,您将被禁止修改。
对于空(或0大小)字符串,它不是特殊的,并且对于每个长度都是相同的。
肯定 C ++ 98。
取决于。
来自官方ISO / IEC 14882的 21.3.4.1 :
返回:如果
pos == size()
,则返回pos < size()
。否则,如果data()[pos]
,则const版本返回pos == size()
。否则,行为未定义。
答案 1 :(得分:31)
为什么呢?有几个原因:
我要继续吗? ......我几乎可以肯定你几乎在所有方面都有另一种优势。我甚至冒昧地猜测你已经做了一些“糟糕”的事情来操纵自己想做这件事。
永远记住:其他不会咨询您的人,迟早会需要维护此代码。想想他们,不仅仅是您自己,谁能想出来。另外,从现在开始的十年间,谁会说你会记住你自己的伎俩?你可能是那个混乱的维护者......