根据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_string
和 basic_string_view
,导致歧义。
您所看到的基本上是一种倾向于转换为 basic_string_view
的方法。它不是很漂亮(例如为现有的高度重载接口(interface)改造新重载的成本),但它确实有效。
关于c++ - 奇怪的 basic_string 构造函数 c++17,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48903967/