字符串索引运算符([])与string_view

时间:2017-09-25 04:09:18

标签: c++ c++17

C++17已经让我们string_view优化我们在需要查看底层字符序列时不必要地分配内存的场景。智慧是你几乎总能用const std::string&取代std::string_view。请考虑以下示例:

char foo(const std::string& str)
{
    return str[0];
}

以上是std::string所有值的有效函数。但是,如果我们将其更改为:

char foo(std::string_view sv)
{
    return sv[0];
}

我们已经为大小为0的字符串触发了未定义的行为! This最后有一个注释:

  

与std :: basic_string :: operator []不同,std :: basic_string_view :: operator []   (size())具有未定义的行为,而不是返回CharT()。

有谁知道为什么行为对于索引运算符来说是不协调的?

1 个答案:

答案 0 :(得分:8)

区别在于std :: string保证NUL终止 - 视图不是。因此,std :: string在第0位始终具有有效值。

对于std :: string:

  

如果pos == size(),则返回对值为CharT()(空字符)的字符的引用。

http://en.cppreference.com/w/cpp/string/basic_string/operator_at