【问题标题】:Why doesn't std::string have a constructor that directly takes std::string_view?为什么 std::string 没有直接采用 std::string_view 的构造函数?
【发布时间】:2022-01-03 20:36:37
【问题描述】:

为了允许从std::string_view构造std::string,有一个模板构造函数

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

仅当 const T&amp; 可转换为 std::basic_string_view&lt;CharT, Traits&gt; (link) 时才启用。

同时有专门的推演指南,可以从basic_string_viewlink)推导出basic_string。对指南的评论说:

需要指南 (2-3),因为 std::basic_string_views 的 std::basic_string 构造函数是模板以避免在现有代码中造成歧义,并且这些模板不支持类模板参数推导。

所以我很好奇,需要有那个推导指南和模板构造函数而不是简单地采用 std::basic_string_view 的构造函数的歧义是什么,例如像

explicit basic_string(basic_string_view<CharT, Traits> sv, const Allocator& alloc = Allocator());

请注意,我不是在问为什么构造函数被标记为显式。

【问题讨论】:

标签: c++ string c++17 constructor-overloading string-view


【解决方案1】:

歧义在于std::stringstd::string_view 都可以从const char * 构造。这使得事情像

std::string{}.assign("ABCDE", 0, 1)

如果第一个参数可以是字符串或 string_view,则不明确。

有几个缺陷报告试图解决这个问题,从这里开始。

https://cplusplus.github.io/LWG/lwg-defects.html#2758

第一件事是让成员将 string_view 带入模板,这降低了他们在重载决议中的优先级。显然,这有点太有效了,所以后来添加了其他调整。

【讨论】:

  • 这是唯一的歧义吗?您能否详细说明后来添加了哪些其他调整?
  • @oliora 我读到“其他调整”是指扣除指南。
猜你喜欢
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 2015-12-20
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多