为什么 std::string_view 没有模板构造函数?

Gui*_*cot 5 c++ c++17

我正在阅读 的文档std::string_view,我注意到这些是构造函数:

constexpr basic_string_view() noexcept;
constexpr basic_string_view(const basic_string_view& other) noexcept = default;
constexpr basic_string_view(const CharT* s, size_type count);
constexpr basic_string_view(const CharT* s);
Run Code Online (Sandbox Code Playgroud)

为什么他们不介绍这个呢?

template<std::size_t n>
constexpr basic_string_view(const CharT(&s)[n]) : basic_string_view(s, n) {}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,它将节省对 的调用strlen()。有什么原因没有被引入吗?

Joh*_*itb 5

原因是它在功能上不等效

char x[255];
sprintf(x, "hello folks");

// oops, sv.size() == 255!
std::string_view sv(x);
Run Code Online (Sandbox Code Playgroud)

strlen不是问题,因为许多编译器“知道”调用的含义strlen并将其替换为常量,如果参数是常量(内联string_view构造函数后,参数将变成字符串文字。所以std::string_view sv("hello folks")会很有效) 。