依赖空 std::string 的索引 0 不好吗?
Is it bad to depend on index 0 of an empty std::string?
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];
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 时为真),运算符将 return 引用 default-constructed禁止修改的字符类型.
对于空(或 0 大小的)字符串,它不是特殊情况,并且对每个长度都一样。
C++03
并且最肯定 C++98。
视情况而定。
官方ISO/IEC1488221.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 的 解释了哪些情况允许您做出假设。我想补充一点
这是糟糕的编程。
为什么?有几个原因:
- 您必须是语言律师才能确保这不是错误。如果不是这个页面,我不会知道答案,坦率地说 - 我认为你也不应该费心去知道。
- 没有直觉认为字符串是空字符终止序列的人在阅读标准或询问他们的朋友之前不知道您要做什么。
- 以糟糕的方式打破了 principle of least surprise。
- 违背了 "writing what you mean" 的原则,即让代码表达问题域概念。
- magic number 的某种用法(在这种情况下 0 是否真的构成幻数是有争议的)。
我要继续吗? ......我几乎可以肯定你在几乎所有方面都有一个替代上级。我什至会冒昧地猜测您还做了其他事情 "bad" 来操纵自己想要这样做。
永远记住:不会咨询你的其他人迟早会需要维护此代码。想想他们,而不仅仅是你自己,谁可以弄清楚。另外,十年后,谁能保证您会记住自己的把戏?您可能是那个令人困惑的维护者...
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];
C++14
否;你可以依靠它。
在21.4.5.2(或[string.access])中我们可以找到:
Returns:
*(begin() + pos)
ifpos < size()
. Otherwise, returns a reference to an object of typecharT
with valuecharT()
, where modifying the object leads to undefined behavior.
换句话说,当 pos == size()
(当两者都为 0 时为真),运算符将 return 引用 default-constructed禁止修改的字符类型.
对于空(或 0 大小的)字符串,它不是特殊情况,并且对每个长度都一样。
C++03
并且最肯定 C++98。
视情况而定。
官方ISO/IEC1488221.3.4.1:
Returns: If
pos < size()
, returnsdata()[pos]
. Otherwise, ifpos == size()
, the const version returnscharT()
. Otherwise, the behavior is undefined.
@Bartek Banachewicz 的
这是糟糕的编程。
为什么?有几个原因:
- 您必须是语言律师才能确保这不是错误。如果不是这个页面,我不会知道答案,坦率地说 - 我认为你也不应该费心去知道。
- 没有直觉认为字符串是空字符终止序列的人在阅读标准或询问他们的朋友之前不知道您要做什么。
- 以糟糕的方式打破了 principle of least surprise。
- 违背了 "writing what you mean" 的原则,即让代码表达问题域概念。
- magic number 的某种用法(在这种情况下 0 是否真的构成幻数是有争议的)。
我要继续吗? ......我几乎可以肯定你在几乎所有方面都有一个替代上级。我什至会冒昧地猜测您还做了其他事情 "bad" 来操纵自己想要这样做。
永远记住:不会咨询你的其他人迟早会需要维护此代码。想想他们,而不仅仅是你自己,谁可以弄清楚。另外,十年后,谁能保证您会记住自己的把戏?您可能是那个令人困惑的维护者...