我发现了C++0x中std::string
和字符串字面量之间的一个令人不安的不一致性:
#include <iostream>
#include <string>
int main()
{
int i = 0;
for (auto e : "hello")
++i;
std::cout << "Number of elements: " << i << '\n';
i = 0;
for (auto e : std::string("hello"))
++i;
std::cout << "Number of elements: " << i << '\n';
return 0;
}
输出结果为:
Number of elements: 6
Number of elements: 5
我理解这种情况发生的原因:字符串字面值实际上是一个包括空字符在内的字符数组,当使用range-based for循环在字符数组上调用std::end()
时,会得到指向数组末尾之后的指针;由于空字符也是字符数组的一部分,所以最终获得的指针就在空字符之后。
然而,我认为这非常不可取:毕竟,对于像长度这样基本的属性,std::string
和字符串字面值应该有相同的行为方式吧?
是否有一种方法可以解决这种不一致性?例如,可以重载字符数组的std::begin()
和std::end()
,使它们所包含的范围不包括终止的空字符?如果可以,那么为什么没有这样做呢?
编辑:为了更好地证明我的不满,对于那些说我只是使用了“遗留功能”的C风格字符串而已受到后果的人,请看下面的代码:
template <typename Range>
void f(Range&& r)
{
for (auto e : r)
{
...
}
}
你会期望f("hello")
和f(std::string("hello"))
执行不同的操作吗?
std::string
创建新的字符串字面量语法。 - HighCommander4