【发布时间】:2015-03-04 18:33:42
【问题描述】:
我用 3 个参数声明了一个 C++ 函数声明,其中两个具有类似的默认值。
void func(int const n, bool const flag=true, int *array=NULL) {
/* print contents of array */
}
当我错误地调用函数时,省略了第二个参数,但包括了第三个参数,就像这样
int array[5]={1,2,3,4,5};
func(5,array);
gcc 和 intel 编译器(Ubuntu 14.04 LTS 上的默认编译器)都没有抱怨指定了最后一个参数而没有指定倒数第二个。代码运行了,但为数组发送了 NULL(我预计代码会失败)。
我的问题是为什么编译器没有抱怨它找不到匹配的函数,因为我的调用签名应该显示为
funct(int const, int *)
在编译期间我可以打开哪些选项来触发有关此错误用法的警告?
【问题讨论】:
-
你应该启用“代码审查员因为添加默认参数而对你大喊大叫”警告:)
-
据我所知,没有任何警告。 Array->pointer->bool 是一个完美定义的转换序列。
-
这是一个高度简化但具有代表性的示例,由更复杂的代码构造而成,如果我避免使用默认值的参数,我将为所有变体提供如此多的重载函数,这将非常笨拙。
-
是否有任何机制可以防止参数进行隐式转换。我计划使用@Slava 建议的方法(即切换参数的顺序),但是在我较大的代码的上下文中,如果我可以在指针参数之前保留布尔参数的默认值,它在语义上会更加清晰和清晰使用默认值并保护指针参数免于显式转换。
标签: c++ compiler-warnings default-arguments