在默认参数结束之前,C++编译器不会警告缺少参数

rao*_*lla 5 c++ compiler-warnings default-arguments

我用3个参数声明了一个C++函数声明,其中两个默认值是这样的.

void func(int const n, bool const flag=true, int *array=NULL) {
  /* print contents of array */
}
Run Code Online (Sandbox Code Playgroud)

当我错误地调用函数时,省略第二个参数但包括第三个参数,就像这样

int array[5]={1,2,3,4,5};
func(5,array);
Run Code Online (Sandbox Code Playgroud)

gcc和intel编译器(Ubuntu 14.04 LTS上的默认编译器)都没有抱怨指定了最后一个参数而没有指定倒数第二个参数.代码运行但是为数组发送了NULL(我希望代码失败).

我的问题是为什么编译器没有抱怨它找不到匹配的函数,因为我的调用的签名应该出现为

funct(int const, int *)
Run Code Online (Sandbox Code Playgroud)

我可以在编译期间打开哪些选项来触发有关此错误使用的警告?

R S*_*ahu 14

编译器将数组衰减为指针并将指针转换为a bool并继续.

更新

从C++ 11标准:

4标准转换 [转化]

1标准转化是具有内置含义的隐式转化.第4条列举了全套此类转换.标准转换序列是一系列标准转换,顺序如下:

- 来自以下集合的零或一次转换:左值到右值的转换,数组到指针的转换以及函数到指针的转换.

- 来自以下集合的零或一次转换:整数促销,浮点促销,积分转换,浮点转换,浮点积分转换,指针转换,成员转换指针和布尔转换.

- 零或一个资格转换.

[ 注意:标准转换序列可以为空,即它可以不包含转换.- 尾注 ]

如果需要,将标准转换序列应用于表达式,以将其转换为所需的目标类型.