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

时间:2017-11-16 19:09:51

标签: c++ c++17

我正在阅读documentation for 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);

他们为什么不介绍这个?

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

在大多数情况下,它会保存对strlen()的通话。有没有理由没有引入?

1 个答案:

答案 0 :(得分:3)

原因是它在功能上并不等同

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

// oops, sv.size() == 255!
std::string_view sv(x);

strlen事情不是问题,因为许多编译器“知道”调用strlen的含义并用常量替换它,如果参数是常量的(在内联{之后) {1}}构造函数,参数变为字符串文字。因此string_view将是有效的。