繁体   English   中英

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

[英]strange basic_string constructor 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() );

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

11)隐式地将t转换为字符串视图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>>为true时std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>此重载才参与重载解析。

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

更新:Q2:第11个构造函数在哪里有用?

他们为什么不只添加basic_string_view构造函数?

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

您所看到的基本上是一种偏向于basic_string_view转换的方法。 它不是很漂亮(这是将新的重载改装为现有的高度重载的接口的成本),但是它可以工作。

如该构造函数的注释中所述:

仅当std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>true std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>此重载才参与重载解决方案

问:为什么不完全添加basic_string(basic_string_view, size_t pos, size_t count, Alloc )构造函数?
回答:如上面摘录所述,类型T不必为basic_string_view类型,而应可转换为basic_string_view<CharT, Traits> (可以通过operator-overloading或其他方式)。

这个第11个构造函数在哪里有用?
回答:T不是basic_string_view类型时(即T不是从basic_string_view直接或间接派生的)。 但是它提供了一些方法(通过operator-overloadingfriend-function或其他方法)将T转换为basic_string_view

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM