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

Is it bad to depend on index 0 of an empty std::string?

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

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

我可以依赖它总是0吗? 还是随意的?

这是不好的编程吗?

编辑:
从一些评论中,我认为对此的有用性存在一些误解。

这样做的目的不是检查字符串是否为空。
不需要检查字符串是否为空。

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

在我看来,检查字符串是否为空是不太有效,然后,如果它不是空的,请查看第一个字符。

1
2
3
4
if (! my_string.empty())
    test = my_string[0];
else
    test = 0;

相反,我只需查看第一个字符,无需检查字符串是否为空。

1
test = my_string[0];


C ++ 14

没有;你可以依靠它。

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

Returns: *(begin() + pos) if pos < size(). Otherwise, returns a reference to an object of type charT with value charT(), where modifying the object leads to undefined behavior.

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

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

C ++ 03

而且肯定也是C ++ 98。

这取决于。

这是官方ISO / IEC 14882的21.3.4.1:

Returns: If pos < size(), returns data()[pos]. Otherwise, if pos == size(), the const version returns charT(). Otherwise, the behavior is undefined.


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

这是糟糕的编程。

为什么?有几个原因:

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

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