重载功能。为什么这里模棱两可?
Overloaded function. Why it's ambiguous here?
我的函数在下面的代码中重载:
void function(char x, double y) {
cout << "char, double" << endl;
}
void function(int x, int y) {
cout << "int, int" << endl;
}
int main() {
function('a', 'b');
return 0;
}
当我试图编译时,它告诉我:"[警告]ISO C++说这些都是模糊的,尽管第一个的最差转换比第二个的最坏转换要好。">
编译器如何在这里进行隐式转换,从而使哪个候选项是正确的?
文字常量'a'
和'b'
的类型为char
,因此不存在完全匹配。出现歧义是因为第一个参数与第一个函数匹配,但第二个参数的优选转换是int
,与第二个函数匹配。
GCC对此非常明确,发布了以下诊断:
警告:ISO C++说这些是不明确的,即使第一个的最差转换比第二个最好
GCC似乎在说,我可以帮你解决这个问题,但ISO C++不允许。然而,类型协议对良好的代码质量和避免错误很重要。
你可以通过铸造来强制选择:
function( static_cast<int>('a'), static_cast<int>('b') );
或者通过提供CCD_ 5过载。
C++中的double
、int
和char
之间有implicit
转换,因此您应该使用static_cast<int>
将数据从char
转换为int
。
function( static_cast<int>(c), static_cast<int>(d) );
这将调用function( int, int );
在您的特定情况下,您使用'a'
和'b'
字符文字,如上所述,它们具有implicit conversions
到int
和double
,因为char
变量表示在assignment operator
中输入的字符的ASCII值。因此,我们可以通过以下方式初始化unsigned char
变量或char
:
unsigned char a = 97; // the ASCII decimal code for "a"
unsigned char b = 'a'; // translates into 97
由于unsigned char
或char
变量是8位变量,而int
是32位值,因此它们具有隐式转换。
要选择重载A而不是重载B,每个参数到A的转换必须与B的转换一样好或更好,并且至少有一个必须更好。
在您的情况下,A有(精确匹配,积分->浮动(,而B有(积分提升,积分提升(。
精确匹配优于积分提升,但积分提升优于积分->浮动转换。因此,A在第一个自变量中有更好的转换,而B在第二个自变量中。因此,目前还不清楚哪一个总体上更好。
对function(char, double)
尝试('a', 'b')
不需要对'a'
进行转换,对'b'
进行浮点积分转换(从char
到double
(。
对于function(int, int)
,'a'
和'b'
都需要整体提升(从char
提升到int
(。
- 警告处理为错误这里有什么问题
- 努力将整数转换为链表。不知道我在这里做错了什么
- 这里在 Linux 中具有"CreatePipe"和"CreateProcessW"功能吗?
- "Inverse SFINAE"避免模棱两可的过载
- 操作员C++的模棱两可的过载
- 模棱两可的重载模板
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 为什么thread_local变量在这里从未初始化?
- 为什么我必须在这里使用dynamic_cast
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- C++ - 为什么这里需要'template'关键字?
- 这里的计数如何变成 5?
- 模棱两可的 != reverse_iterator运算符
- 在这里,当我们比较 if(vc[i]==vc1[i]) 时,它是向量数组. 实际上比较的值是多少,
- SFINAE不能防止模棱两可的操作员过载吗?
- 这里的 = 运算符有什么用法?
- 这里的字符串函数是什么意思
- 重载功能。为什么这里模棱两可?