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

标签 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() 的调用。有什么原因没有引入它吗?

最佳答案

原因是它在功能上不等价

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

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

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

关于c++ - 为什么没有 std::string_view 的模板构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47337363/

相关文章:

c++ - 对包含圆圈的列表进行排序 C++

c++ - 在 vim 的状态行上显示文件扩展名

c++ - 在 GDB 中调试生成的代码时显示原始源代码

c++ - 尝试交换可变参数模板类时如何正确重载 operator=?

c++ - 如何解决 C++ std::string_view 超出范围的问题?

c++ - 无法打开文件

c++ - 为什么 OpenGL 雾只是不出现?

c++ - 关于对齐存储和普通可复制/可破坏类型

c++ - 使用花括号初始化器列表时模板参数推导失败

c++ - 如何基于sizt_t…Ints的模板参数包构造类模板的元组类型?