【发布时间】:2015-07-31 00:38:33
【问题描述】:
http://en.cppreference.com/w/cpp/language/implicit_cast 的页面指出,在一个隐式转换序列中最多可以完成三个转换序列:
隐式转换序列按以下顺序由以下组成:
- 零个或一个标准转换序列
- 零次或一次用户定义的转换
- 零个或一个标准转换序列
这三个发生的例子是什么?
【问题讨论】:
-
呃,那个页面不是已经提供了很多例子了吗?
http://en.cppreference.com/w/cpp/language/implicit_cast 的页面指出,在一个隐式转换序列中最多可以完成三个转换序列:
隐式转换序列按以下顺序由以下组成:
- 零个或一个标准转换序列
- 零次或一次用户定义的转换
- 零个或一个标准转换序列
这三个发生的例子是什么?
【问题讨论】:
我不明白这三个怎么会连续发生。这意味着您可以在两个语言定义的类型(比如说int* 和char)与用户定义类的中间(称为Stuff)之间进行隐式转换。在我看来,你没有理由想要这样做int*>Stuff>char(例如)。
换句话说,从A到B的隐式转换意味着“A可以理解为B”。为语言定义类型添加这样一条规则听起来很奇怪,更奇怪的是用“A可以理解为我的类C”和“我的类C可以理解为B”来解释”。
但要使规则有意义,提供 1. 和 2. 的示例以及 2. 和 3. 的示例就足够了。这很容易做到。
如果您还没有弄清楚,只需考虑一个可以转换为int(用户定义Date::int())并且可以从int(复制构造函数)。然后,通过考虑 int>long 和 short 到 int 的转换,您就有了示例。
Date d;
short a = 1234;
d = a; // Convertion short>int and int>Date (1. and 2.)
long b = d; // Convertion Date>int and int>long (2. and 3.)
【讨论】:
operator int 在基类中,其隐含对象参数的类型仍然是Derived&(或const Derived&等)带有Derived对象。