gpt4 book ai didi

c++ - 函数重载的规则

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:18 24 4
gpt4 key购买 nike

看看这段代码(例如):

#include <iostream>
void print(unsigned int value);
void print(float value);

int main() {
print('a');
print(0);
print(3.14159);
return 0;
}

我得到下一个错误:

'print(char)' is ambiguous

这里真正的问题是什么?我知道不止一个函数适用于来自 main 的任何调用(打印函数)。但是 函数重载 中的真正规则是什么(我怎么知道什么适合什么,在哪些类型之间存在强制转换等)

我怎么知道有多个函数适合调用? (更多示例:不明显如何理解这两个函数适用于调用)

#include <iostream>

void print(unsigned int value);
void print(int value);

int main() {
print(2.5);
}

最佳答案

当您处理函数重载时,编译器会在幕后执行大量工作来执行函数重载解析。此处列出的细节非常好,但是我可以提供一些可能有用的链接,并尝试描述一些更重要的部分。


There are 3 possible results:

  • A match is found. The call is resolved to specific overload
  • No match found. The arguments can not be matched to any overload
  • An ambiguous match is found. Arguments matched more than one overload

The basic order of what the compiler will do is this:

  • Find exact match based on parameter list
  • Tries to find a match through promotion
  • Tries to find a match through standard conversion
  • Tries to find a match through user-defined conversion

So how is it determined if a call is ambiguous?

由于每个重载都必须具有唯一的参数,并且由于所有标准转换和所有用户定义的转换都被认为是相等的;如果一个函数调用通过标准或用户定义的转换匹配多个有效的声明定义候选者,那么结果将是不明确的。


来自您的示例:

void print( unsigned int value );
void print( float value );

print( 'a' );
print( 0 );
print( 3.14159 );

print( 'a' ); 的情况下,C++ 无法找到精确匹配。它会首先尝试将 'a' 提升为 int,但是没有声明定义的 print(int) 函数。然后它将尝试使用标准转换,它可以将 'a' 转换为 unsigned intfloating point 值。由于所有标准转换都被认为是相等的,因此这会导致歧义。


要解决这种歧义,您可以简单地 declare-define print( type ); 所需的版本,或者您可以显式地将类型转换为提供的重载之一参数类型。

关于c++ - 函数重载的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49244737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com