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

时间:2019-01-09 17:38:17

标签: c++

假设我们在C ++ 20标准库的while user_answer != real_answer: t2 = datetime.now() delta = t2 - t1 if(delta.total_seconds()>=30): print "You ran out of time." break 标头中添加了一个新的类模板:

<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_view的任何现有代码吗?

我担心std::stringstd::string之间现在有两条路径。这就是直接路径,并且通过std::string_view进行了两步转换。

要澄清“关闭者”的具体问题:

使用std::cstring和/或std::string的当前正在运行的程序的示例是什么,如果对std::string_view<string_view>进行了描述的更改,它将停止运行?还是不存在这样的例子?

1 个答案:

答案 0 :(得分:1)

  

我担心std :: string和std :: string_view之间现在有两条路径。这就是直接路径,并通过std :: cstring进行了两步转换。

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

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

  

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

这样的例子不存在。