![](/img/trans.png)
[英]string constructor taking two char* into another std::string works in c++14 but not 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_string
和basic_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-overloading
或friend-function
或其他方法)将T
转换为basic_string_view
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.