【问题标题】:C++ operator== and user-defined type castsC++ operator== 和用户定义的类型转换
【发布时间】:2017-04-10 20:40:15
【问题描述】:

我有一个名为 uniVal 的类,它定义了到 int_64 double 和 string 的转换。当我尝试将此类的对象与 int GCC 进行比较时说: 候选人是:

operator==(int, int) <built-in>
operator==(int64_t {aka long int}, int) <built-in>
operator==(unsigned int, int) <built-in>
operator==(long unsigned int, int) <built-in>
operator==(float, int) <built-in>
operator==(double, int) <built-in>
error: ambiguous overload for ‘operator==’ (operand types are ‘uniVal’ and ‘int’)

但如果我指定强制转换为双精度,则它会编译。是否可以让 gcc 选择最接近其他参数类型的转换类型?

更新: 为每种类型组合编写自己的 operator== 当然可以解决这个问题,但是我希望这个类能够与所有 c++ 类型一起工作,所以我只想编写一堆转换函数,让编译器完成剩下的工作。

【问题讨论】:

  • 如果你自己写了operator==(uniVal, int)operator==(int, uniVal),那应该可以解决问题

标签: c++ gcc


【解决方案1】:

是否可以让 gcc 选择最接近其他参数类型的转换类型?

短版:不,因为在重载解析中,不考虑每个参数类型的关系。

长版:

编译器找到所有可行的函数(即理论上可以通过转换或直接使用给定参数调用的所有函数)并将它们相互排名。当且仅当其中一个可行功能严格优于所有其他功能时,重载解决方案才会成功。 here(“最佳可行函数”部分)提供了函数如何相互比较的精确列表。对于这种特殊情况,只有以下内容是相关的:

如果 F1 的所有参数的隐式转换不比 F2 的所有参数的隐式转换差,并且 [...] F1 的至少一个参数的隐式转换,则 F1 被确定为比 F2 更好的函数转换优于 F2 [...]

的该参数的相应隐式转换

其余规则不适用于您的上下文,因为每个运算符的返回类型都是相同的,并且它们不是模板(或其特化)。 此外,您的第二个操作数不需要任何转换(在您的问题中存在的重载子集中),因此这完全是关于将 uniVal 转换为 longdouble 以及以下数字提升/转换。

每个的转换序列根据以下排名(参见here;“隐式转换序列排名”部分):

  1. 精确匹配:无需转换,左值到右值转换,限定转换,类类型到同一类的用户定义转换

  2. 提升:积分提升、浮点提升

  3. 转换:整数转换、浮点转换、浮点整数转换、指针转换、指针到成员的转换、布尔转换、派生类到用户定义的转换它的基地

在您的情况下,long intdouble 除了用户定义的转换外,都不需要额外的转换。因此,它们的排名彼此相同(但优于需要需要额外转换的其他候选者)。因此,您的调用是模棱两可的。

您会注意到没有比较不同参数类型的点。这是(不是?)这样做是有充分理由的:毕竟,函数体中的参数可能根本不会相互结合使用(实际上,它们将在 operator== 中,但对于编译器来说,这只是像所有其他函数一样)在这种情况下比较它们的类型不会提供任何有用的信息。

【讨论】:

  • 我意识到这有点离开了问题的范围。在我写完这篇文章之前,我错过了一些关于所问内容的细节,所以我想我应该完成我开始的工作。
  • 嗯,我发现这些信息非常有用,所以谢谢
猜你喜欢
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多