为了允许从std::string构造std::string_view,有一个模板构造函数
template<class T>
explicit basic_string(const T& t, const Allocator& alloc = Allocator());只有当const T&可转换为std::basic_string_view<CharT, Traits> (链接)时才启用该功能。
同时,有一个特殊的演绎指南,从basic_string ( basic_string_view,链接)中推导出链接。对指南的评论说:
需要指南(2-3),因为std::basic_string_views的std::basic_string_views构造函数是模板,以避免在现有代码中造成歧义,而这些模板不支持类模板参数推断。
所以我很好奇,什么是不明确的,需要有演绎指南和模板构造函数,而不是简单地使用std::basic_string_view的构造函数,例如
explicit basic_string(basic_string_view<CharT, Traits> sv, const Allocator& alloc = Allocator());请注意,我不是在问构造函数为什么被标记为显式。
发布于 2021-11-25 15:26:59
含糊不清的是,std::string和std::string_view都可以从const char *构建。这让事情像
std::string{}.assign("ABCDE", 0, 1)如果第一个参数可以是字符串或string_view,则不明确。
有几个缺陷报告试图解决这个问题,从这里开始。
https://cplusplus.github.io/LWG/lwg-defects.html#2758
第一件事是让成员将string_view放入模板中,这降低了它们在过载解析中的优先级。显然,这有点太有效了,所以后来又增加了其他调整。
https://stackoverflow.com/questions/70113292
复制相似问题