string和string_view的索引操作符([])之间的区别

skg*_*nga 6 c++ c++17

C++17string_view当我们只需要查看底层字符序列时,我们已经让我们优化了我们不必要地分配内存的场景.智慧是,你几乎可以随时更换const std::string&使用std::string_view.请考虑以下示例:

char foo(const std::string& str)
{
    return str[0];
}
Run Code Online (Sandbox Code Playgroud)

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

char foo(std::string_view sv)
{
    return sv[0];
}
Run Code Online (Sandbox Code Playgroud)

我们已经为大小为0的字符串触发了Undefined Behavior!最后有一个注释:

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

有谁知道为什么索引操作符的行为是不协调的?

xax*_*xon 8

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

对于std :: string:

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

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