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条列举了全套此类转换.标准转换序列是一系列标准转换,顺序如下:
- 来自以下集合的零或一次转换:左值到右值的转换,数组到指针的转换以及函数到指针的转换.
- 来自以下集合的零或一次转换:整数促销,浮点促销,积分转换,浮点转换,浮点积分转换,指针转换,成员转换指针和布尔转换.
- 零或一个资格转换.
[ 注意:标准转换序列可以为空,即它可以不包含转换.- 尾注 ]
如果需要,将标准转换序列应用于表达式,以将其转换为所需的目标类型.
| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |