这是解决函数调用歧义的正确方法吗?



我有这样的代码:

#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_tvoid*以满足其他重载。字面量0可以隐式地转换为任何一种类型,并且转换规则没有告诉它选择其中任何一种类型,因此结果是不明确的。

为了指定你想要调用test(size_t),你需要显式地创建类型为size_t0,即

test(size_t{0});

相关内容

  • 没有找到相关文章

最新更新