我有以下简单的示例代码,其中包含两个整数类型的类构造函数:
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;
}
当我在64位模式下使用gcc 4.8.4进行编译时,仅收到一个错误:
error: conversion from ‘long int’ to ‘Y’ is ambiguous
Y y3 = _long;
^
我不明白的是为什么允许_char
和_short
转换,但是_long
含糊不清。
确定最佳可行候选者时,转化类型分为三个等级:完全匹配,提升(包括积分提升)和转化(包括积分转化)。
小于int
可以提升为的任何整数类型int
,其他所有都是转换。因此,对于char
和short
,升职是最可行的候选人。对于int
和long long
,我们只选择完全匹配。
对于long
,但是,我们有两种选择都涉及一个整体转换。没有规则来区分两次转换中的哪一次是“更好”的,因此我们最终会产生歧义。您将不得不将long
自己转换为所需的类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句