首页 > 解决方案 > 与三种类型之间的隐式转换的交互?

问题描述

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

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::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_viewor的代码std::string吗?

我担心现在std::string和之间有两条路径std::string_view。那是直接路径,以及通过std::cstring.

为了澄清“更接近”的具体问题:

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

标签: c++

解决方案


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

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

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

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

这样的例子不存在。


推荐阅读