为什么这个整数隐式转换含糊不清?

时间:2015-10-03 12:45:15

标签: c++ implicit-conversion

我有以下简单的示例代码,两个整数类型的类构造函数:

struct Y
{
  Y(int) {}
  Y(long long) {}
};

这来自:

void foo()
{
  char          _char;
  short         _short;
  int           _int;
  long          _long;
  long long     _longlong;

  Y y0 = _char;
  Y y1 = _short;
  Y y2 = _int;
  Y y3 = _long;
  Y y4 = _longlong;
}

当我用gcc 4.8.4编译它时,在64位模式下,我只得到一个错误:

error: conversion from ‘long int’ to ‘Y’ is ambiguous
   Y y3 = _long;
          ^

我不明白为什么允许_char_short次转化,但_long含糊不清。

1 个答案:

答案 0 :(得分:2)

在确定最佳候选人时,转换类型有三个等级:完全匹配,促销(包括整体促销)和转换(包括积分转换)。

任何小于int的整数类型都可以提升int,其他所有内容都是转换。因此,对于charshort,促销是最有效的候选人。对于intlong long,我们只需选择完全匹配即可。

但是,对于long,我们有两个选项,其中包含一个完整的转换。没有规则来区分两个转换中的哪一个更好",因此我们最终会产生歧义。您必须将long自己投射到所需的类型。