【问题标题】:Three conversions in C++ implicit conversion sequenceC++隐式转换序列中的三种转换
【发布时间】:2015-07-31 00:38:33
【问题描述】:

http://en.cppreference.com/w/cpp/language/implicit_cast 的页面指出,在一个隐式转换序列中最多可以完成三个转换序列:

隐式转换序列按以下顺序由以下组成:

  1. 零个或一个标准转换序列
  2. 零次或一次用户定义的转换
  3. 零个或一个标准转换序列

这三个发生的例子是什么?

【问题讨论】:

  • 呃,那个页面不是已经提供了很多例子了吗?

标签: c++ implicit-conversion


【解决方案1】:

我不明白这三个怎么会连续发生。这意味着您可以在两个语言定义的类型(比如说int*char)与用户定义类的中间(称为Stuff)之间进行隐式转换。在我看来,你没有理由想要这样做int*>Stuff>char(例如)。

换句话说,从AB的隐式转换意味着“A可以理解为B”。为语言定义类型添加这样一条规则听起来很奇怪,更奇怪的是用“A可以理解为我的类C”和“我的类C可以理解为B”来解释”。


但要使规则有意义,提供 1. 和 2. 的示例以及 2. 和 3. 的示例就足够了。这很容易做到。

如果您还没有弄清楚,只需考虑一个可以转换为int(用户定义Date::int())并且可以从int(复制构造函数)。然后,通过考虑 int>longshortint 的转换,您就有了示例。

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.)

【讨论】:

  • 现在如果 d 是一个非 const 左值并且 Date::operator int 是一个 const 成员函数,或者如果 d 具有从 Date 派生的其他类型,那么您将拥有全部三个
  • @Cubbi Meh,绑定到相同类型的 const 引用的非 const 对象的转换顺序是身份转换(即无 - 参见 [over.ics.ref]/p1),和转换函数被认为是隐含对象参数的类的成员,以便定义隐含对象参数的类型(参见 [over.match.funcs]/p4),因此隐含对象参数的类型始终与论据。
  • @T.C.好吧,over.ics.ref 对派生到基础的排名不同,无论如何,排名都是次要属性。
  • @Cubbi 不过,它不是派生到基础的。根据 [over.match.funcs]/p4,转换函数的隐含对象参数的类型由其隐含对象参数确定,因此即使 operator int 在基类中,其隐含对象参数的类型仍然是Derived&(或const Derived&等)带有Derived对象。
  • 大多数 cmets 都让我有点不知所措,但我认为主要结论是不可能同时使用这三个。我有同样的想法,因为这意味着从标准 => 用户 => 标准开始,在这种情况下,我认为只会应用标准 => 标准转换。但是,我认为我可能会误解,因此试图澄清 SO。如果接下来几天没有进一步讨论,我会选择“已回答”。
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多