我有以下简单的示例代码,两个整数类型的类构造函数:
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
含糊不清。
答案 0 :(得分:2)
在确定最佳候选人时,转换类型有三个等级:完全匹配,促销(包括整体促销)和转换(包括积分转换)。
任何小于int
的整数类型都可以提升到int
,其他所有内容都是转换。因此,对于char
和short
,促销是最有效的候选人。对于int
和long long
,我们只需选择完全匹配即可。
但是,对于long
,我们有两个选项,其中包含一个完整的转换。没有规则来区分两个转换中的哪一个更好",因此我们最终会产生歧义。您必须将long
自己投射到所需的类型。