三种类型之间的隐式转换交互

Interactions with implicit conversion between three types?

本文关键字:转换 交互 之间 类型 三种      更新时间:2023-10-16

假设我们在 C++20 标准库的 <string_view> 标头中添加了一个新的类模板:

template<class charT, class traits = char_traits<charT>>
class basic_string_view;  // existing
template<class charT, class traits = char_traits<charT>>
class basic_cstring_view;  // new

我们希望做到:

  • std::cstring_view可隐式转换为std::string_view
  • std::string可隐式转换为std::cstring_view
  • std::string(保持)隐式转换为std::string_view

如果我们添加到std::basic_cstring_view的定义中:

operator basic_string_view<charT, traits>() const noexcept; // new

我们添加到std::basic_string的定义中:

operator basic_string_view<charT, traits>() const noexcept; // existing
operator basic_cstring_view<charT, traits>() const noexcept; // new

这会产生问题、模棱两可吗? 它会破坏任何使用 std::string_viewstd::string 的现有代码吗?

我担心现在std::stringstd::string_view之间有两条路径。 这是直接路径,以及通过std::cstring进行两步转换。

澄清"更近"的具体问题:

当前使用std::string和/或std::string_view的程序的示例是什么,鉴于所描述的对<string_view><string>的更改,它将停止工作? 还是不存在这样的例子?

我担心现在在std::

string和std::string_view之间有两条路径。这是直接路径,以及通过 std::cstring 的两步转换。

这些路径中只有一条是有效的,因为具有多个用户定义转换的隐式转换序列不是有效的候选项。

澄清一下,隐式转换上下文中的"用户定义"并不是指与标准文档的区别,而是指类的所有转换运算符和转换构造函数(即用户定义的数据类型)。

还是不存在[当前使用std::string和/或std::string_view的程序的示例,鉴于对<string_view><string>的描述更改,它将停止工作]?

这样的例子并不存在。