c++ 依赖于空std::string的索引0是不是不好?

7cjasjjr  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(95)
std::string my_string = "";
char test = my_string[0];

我注意到它不会崩溃,每次我测试它,test都是0。
我能相信它总是0吗?还是任意的
这是糟糕的编程吗?
编辑:从一些评论中,我推测对此的有用性存在一些误解。
这样做的目的不是检查字符串是否为空。不需要检查字符串是否为空。
这种情况是有一个字符串可能是空的,也可能不是空的。我只关心这个字符串的第一个字符(如果它不是空的)。
在我看来,检查字符串是否为空,然后,如果不为空,则查看第一个字符,效率会降低。

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

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

test = my_string[0];
6ie5vjzr

6ie5vjzr1#

C++14

”””不,你可以依赖它。**
21.4.5中。2(或[字符串。access])我们可以找到:
如果pos < size(),则返回*(begin() + pos)。否则,返回对charT类型的对象的引用,其值为charT(),其中修改该对象会导致未定义的行为。
换句话说,当pos == size()(当两者都为0时为true)时,运算符将返回对默认构造的字符类型的引用,禁止修改
对于空字符串(或0大小的字符串),它不是特殊大小写的,并且对于每个长度都是一样的。

C++03

C++98也是如此。

这取决于。

这里是21。3.4.1来自官方ISO/IEC 14882:
返回:如果pos < size(),则返回data()[pos]。否则,如果pos == size(),const版本将返回charT()。否则,行为是未定义的。

nzk0hqpo

nzk0hqpo2#

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

这是糟糕的编程。

为什么呢?有几个原因:
1.你必须是一个语言律师,以确保这不是一个错误。如果没有这一页,我不知道答案,坦率地说,我认为你也不应该费心去知道。
1.没有字符串是以null结尾的字符序列的直觉的人在阅读标准或询问他们的朋友之前不知道你在做什么。
1.以一种糟糕的方式打破了principle of least astonishment
1.违背了“写你所想”的原则,我。e.使代码表达问题域概念。
1.某种程度上使用了magic number(在这种情况下,0是否真的构成幻数还存在争议)。
要我继续吗……我几乎可以肯定你在几乎所有方面都有一个替代的上级。我甚至会大胆猜测,你已经做了一些其他的“坏”来操纵自己想要这样做。
永远记住:**其他人,他们不会咨询你,迟早会需要维护这些代码。**想想他们,而不仅仅是你自己,谁能弄清楚。另外,十年后,谁能保证你会记得你自己的魔术呢?你可能就是那个令人困惑的维护者。..

相关问题