我有这样的代码:
#include <cstdio>
void test(size_t const pos){
printf("size_tn");
}
void test(const void *ptr){
printf("ptrn");
}
//void test(int const pos){
// printf("intn");
//}
int main(){
size_t x = 0;
test(x);
test(nullptr);
test(&x);
// test(0);
// some more that fail, but I do not care too much about them:
// test(0U);
// test(0L);
// test(NULL);
}
当我取消注释test(0);
时,它不编译,因为编译器不知道如何转换'0'。
如果我引入'int'重载,所有东西都会重新编译。
这是避免歧义函数调用的正确方法吗?
正确的意思是-我不想调用指针重载,除非参数是指针或传递了nullptr
。
我知道当前的"设置"与0U
, 0L
, NULL
失败。
文字0
的类型为int
。如果存在test(int)
重载,则调用该函数,因为不需要转换。容易。
如果没有可用的test(int)
,那么编译器将查看是否可以将实参转换为size_t
或void*
以满足其他重载。字面量0
可以隐式地转换为任何一种类型,并且转换规则没有告诉它选择其中任何一种类型,因此结果是不明确的。
为了指定你想要调用test(size_t)
,你需要显式地创建类型为size_t
的0
,即
test(size_t{0});