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

时间:2015-10-12 14:06:51

标签: c++ stdstring

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];

2 个答案:

答案 0 :(得分:69)

C ++ 14

否;你可以依靠它。

21.4.5.2 (或[string.access])中,我们可以找到:

  

如果*(begin() + pos),则返回pos < size()。否则,返回对值为charT的{​​{1}}类型的对象的引用,其中修改对象会导致未定义的行为。

换句话说,当charT()(两者都为0时为真)时,运算符将返回对默认构造的字符类型的引用,您将被禁止修改

对于空(或0大小)字符串,它不是特殊的,并且对于每个长度都是相同的。

C ++ 03

肯定 C ++ 98。

取决于。

来自官方ISO / IEC 14882的 21.3.4.1

  

返回:如果pos == size(),则返回pos < size()。否则,如果data()[pos],则const版本返回pos == size()。否则,行为未定义。

答案 1 :(得分:31)

@Bartek Banachewicz的answer解释了哪些情况允许你做出你的假设。我想补充一下

这是糟糕的编程。

为什么呢?有几个原因:

  1. 你必须是一名语言律师才能确保这不是一个错误。如果不是这个页面,我不知道答案,坦率地说 - 我认为你不应该真的很想知道。
  2. 没有字符串直觉的人是一个空终止的字符序列,在他们阅读标准或询问他们的朋友之前,他们不知道你要做什么。
  3. 以糟糕的方式打破principle of least surprise
  4. 违背“写你的意思”的原则,即让代码表达问题域概念。
  5. 使用magic number的分类(在这种情况下,0是否实际上构成了一个幻数)。
  6. 我要继续吗? ......我几乎可以肯定你几乎在所有方面都有另一种优势。我甚至冒昧地猜测你已经做了一些“糟糕”的事情来操纵自己想做这件事。

    永远记住:其他不会咨询您的人,迟早会需要维护此代码。想想他们,不仅仅是您自己,谁能想出来。另外,从现在开始的十年间,谁会说你会记住你自己的伎俩?你可能是那个混乱的维护者......