c++ - 与三种类型之间的隐式转换的交互?
问题描述
假设我们<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::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_view
or的代码std::string
吗?
我担心现在std::string
和之间有两条路径std::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>
停止工作]的示例不存在?
这样的例子不存在。
推荐阅读
- java - 为什么 DES 加密在 Java 中执行的结果与在 PHP 中执行的结果不同?
- react-native - 无法将 React Native Web 与 react Navigation 集成
- mysql - 仅选择具有特定值的最新行
- excel - 如何自动将日期转换为特定的文本字符串?
- checkbox - 在 onChanged 回调中 CheckBox 值始终为真
- javascript - 在 primefaces 数据表中显示计时器 setInterval
- bash - 使用 bash 脚本从二进制闪存映像的末尾删除 0xff
- javascript - 为什么 String.prototype.split() 方法不尊重正则表达式中的捕获组?
- linux - 如何可靠地从另一个进程连续写入的文件中读取数据?
- eclipse-plugin - 为什么这个 Eclipse RCP 插件缺少视图?