为什么 std::string 没有直接采用 std::string_view 的构造函数?
Why doesn't std::string have a constructor that directly takes std::string_view?
为了允许从 std::string_view
构造 std::string
有一个模板构造器
template<class T>
explicit basic_string(const T& t, const Allocator& alloc = Allocator());
仅当 const T&
可转换为 std::basic_string_view<CharT, Traits>
(link) 时才启用。
同时有专门的推导指南,可以从basic_string_view
推导basic_string
(link)。对指南的评论说:
Guides (2-3) are needed because the std::basic_string constructors for std::basic_string_views are made templates to avoid causing ambiguities in existing code, and those templates do not support class template argument deduction.
所以我很好奇,需要推导指南和模板构造函数而不是简单地采用 std::basic_string_view
的构造函数的歧义是什么,例如像
explicit basic_string(basic_string_view<CharT, Traits> sv, const Allocator& alloc = Allocator());
请注意,我不是在问为什么构造函数被标记为显式。
歧义在于 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 放入模板中,这会降低它们在重载决策中的优先级。显然,这有点太有效了,所以后来添加了其他调整。
为了允许从 std::string_view
构造 std::string
有一个模板构造器
template<class T>
explicit basic_string(const T& t, const Allocator& alloc = Allocator());
仅当 const T&
可转换为 std::basic_string_view<CharT, Traits>
(link) 时才启用。
同时有专门的推导指南,可以从basic_string_view
推导basic_string
(link)。对指南的评论说:
Guides (2-3) are needed because the std::basic_string constructors for std::basic_string_views are made templates to avoid causing ambiguities in existing code, and those templates do not support class template argument deduction.
所以我很好奇,需要推导指南和模板构造函数而不是简单地采用 std::basic_string_view
的构造函数的歧义是什么,例如像
explicit basic_string(basic_string_view<CharT, Traits> sv, const Allocator& alloc = Allocator());
请注意,我不是在问为什么构造函数被标记为显式。
歧义在于 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 放入模板中,这会降低它们在重载决策中的优先级。显然,这有点太有效了,所以后来添加了其他调整。