c++ - 当出现不明确的默认参数时,C++ 编译器会做什么?

标签 c++ compiler-construction default-value overloading

当出现不明确的默认参数时,C++ 编译器会做什么?例如,假设有一个函数,例如:

void function(int a = 0, float b = 3.1);
void function(int a, float b =1.1, int c = 0);

以上是否被认为是模棱两可的?如果不是,编译器在调用 function1(10) 之类的东西时会做什么(函数如何精确匹配)?

谢谢!

最佳答案

下面是可以的

void function(int a = 0, float b = 3.1);
void function(int a, float b =1.1, int c = 0);

下面的也行

function(); // calls first function

但是下面是模棱两可的

function(1); // second and first match equally well

对于重载决议(告诉调用什么函数的过程),没有传递显式参数和使用默认参数的参数将被忽略。所以编译器确实看到两个函数都具有一个用于上述调用的 int 参数并且无法决定。

下面的格式不正确

void function(int a = 0, float b = 3.1);
void function(int a, float b =1.1);

虽然对于您问题中的代码,您声明了两个 函数(因为两个声明具有不同数量的参数),但在此示例中您只声明了一个 函数。但是它的第二个声明重复了参数的默认参数(甚至使用不同的值,但这不再重要了)。这是不允许的。注意下面的就可以了

void function(int a, float b = 3.1);
void function(int a = 0, float b);

出现在同一函数的同一范围内的声明的默认参数集被合并,并且仅适用于出现在同一范围内的那些。所以下面是有效的

void function(int a = 0, float b = 3.1);
void function1() {
  void function(int a, float b = 1.1); 
  function(0);
}

这会调用为 b 传递的 1.1 函数。

关于c++ - 当出现不明确的默认参数时,C++ 编译器会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3858344/

相关文章:

c++ - 无法在我的 C++ 代码中执行超过 1 行

c++ - 尾随返回类型、declval 和引用限定符 : can they work together?

assembly - 如何在 MIPS 中在堆栈上推送和弹出地址

c - MinGW 编译器不需要函数声明?

c# - 为什么使用默认(类型)时契约(Contract)格式错误?

c++ - 我应该如何包含在我的静态库中?

c++ - 使用自定义绘图在Win32 API中设置按钮文本颜色

c++ - 如果位于头文件中的 "heavy"函数没有标记为 'inline' ,那么它的代码被编译到哪里?

c++ - 为通过引用传递的参数分配默认值

swift - 使用默认值参数覆盖函数时,如何保持默认值与父类(super class)相同?