当出现不明确的默认参数时,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/