标准转换如何包含用户定义的转换?

问题描述 投票:0回答:1

我正在尝试理解来自 cppreference.com 的以下语言(强调我的):

每种类型的标准转换序列都被分配三个等级之一:

  1. 精确匹配:无需转换、左值到右值转换、限定转换、函数指针转换 (C++17 起)、类类型到同一类的用户定义转换
  2. 促销:积分促销、浮点促销
  3. 转换:整数转换、浮点转换、浮点积分转换、指针转换、指针到成员转换、布尔转换、
  4. 派生类与其基类的用户定义转换

隐式转换的讨论来看,听起来标准转换序列不能包含用户定义的转换。 相反,隐式转换要么仅包含标准转换,要么包含夹在两个(可能为零长度)标准转换序列之间的单个用户定义转换。

那么标准转换怎么可能包含用户定义的转换呢? 类类型到同一类的用户定义转换或类到其基类的用户定义转换的示例是什么? 例如,用户定义的复制构造函数是否被视为标准转换,因此可以在同一隐式转换序列中与真正的用户定义转换配对? 有人可以给出一个简单的例子,说明用户定义的转换被视为像这样的标准转换,或者解释我如何误读引用的文本吗?

c++ implicit-conversion overload-resolution
1个回答
0
投票
隐式转换序列仅出于重载解析的目的而存在,并不是“真正的”转换,尽管隐式转换序列形成的规则旨在与复制初始化的规则并行:毕竟,重载解析应该基于某些东西类似于调用特定重载时实际发生的情况。

因此,“标准转换序列”(重载解析过程中的虚构实体)不必表示“标准转换”(实际上可以根据

[conv]中的规则进行评估)。

在重载决策中,例如

struct T {}; void f(T); int main() { T t; f(t); }
我们认为从 

t

T
 的隐式转换序列是恒等转换,这是一个标准转换序列,因为这正是重载解析规则告诉我们的。在重载决策期间,如果调用 
f
,实际发生的情况将被忽略。在大多数情况下,这将是对 
T
 的复制构造函数的调用。因此,如果选择重载,标准转换序列
can对应于函数调用,但函数调用实际上并不是标准转换序列的一部分。在这种情况下,标准转换序列本身基本上只是“什么也不做”。

如果参数具有从

U

 派生的类型 
T
,类似地,重载解析过程只是假设在实际选择候选者的情况下转换将以某种方式成功,但不关心该转换实际上将如何完成。在这种情况下,标准转换序列只是说“将派生类型
U
转换为基类
T
”并给出“转换”等级,也就是说,它比从类型到自身的转换更糟糕(这会产生“完全匹配”排名)。

© www.soinside.com 2019 - 2024. All rights reserved.