c++ - 奇怪的 basic_string 构造函数 c++17

标签 c++ string c++17

根据cppreference basic_string 有 11 个构造函数。

第 11 个构造函数看起来很奇怪,因为它采用模板未知的 T 类型。

template < class T >
basic_string( const T& t, size_type pos, size_type n,
              const Allocator& alloc = Allocator() );

据我所知,它使用 when 从 pos 的 string_view 构造字符串,并计算字符数。

11) 将 t 隐式转换为字符串 View sv,如同通过 std::basic_string_view<CharT, Traits> sv = t; , 然后用 sv 的子范围 [pos, pos + n) 初始化字符串,就好像 basic_string(sv.substr(pos, n), a) .此重载仅在 std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>> 时参与重载决议是真的。

问:为什么没有完全添加 basic_string(basic_string_view, size_t pos, size_t count, Alloc ) 构造函数?

Upd:Q2:这个第 11 个构造函数有什么用?

最佳答案

Why didn't they just add a basic_string_view constructor?

他们试过了。它炸毁了 std::string s("ABCDE", 0, 1); 因为 "ABCDE" 同样可以很好地转换为 basic_stringbasic_string_view,导致歧义。

您所看到的基本上是一种倾向于转换为 basic_string_view 的方法。它不是很漂亮(例如为现有的高度重载接口(interface)改造新重载的成本),但它确实有效。

关于c++ - 奇怪的 basic_string 构造函数 c++17,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48903967/

相关文章:

c++ - 概念可以替换模板关键字的所有其他实例吗?

c++ - 为什么右值引用参数与重载决策中的 const 引用匹配?

c# - C#/C++ 之间的 Replace() 差异

c++ - 基于一个点的角度射击子弹

c++ - 用于空间和性能提升的位对齐

string - 匹配到 "::"之前的模式不适用于 string.gsub

c++ - 尝试从字符串中获取 int 时出错

arrays - 获取数组而不是字符串

c++ - 尝试翻转 std::bitset 中的位顺序

c++ - 类静态变量初始化的规则是什么?