#include <iostream>
using namespace std;
void foo(const int*){cout << "no ref";}
void foo(const int*&){cout << "on ref";}
int main()
{
int* i=nullptr;
foo(i);
}
编辑:
此
#include <iostream>
using namespace std;
void foo(const int){cout << "no ref";}
void foo(const int&){cout << "on ref";}
int main()
{
int i=0;
foo(i);
}
产生歧义。
顺便说一句,删除const产生歧义。
编译器:带标志的g ++ 5.3.0 --std = c ++ 14
答案 0 :(得分:4)
- 为什么以下示例代码不会产生歧义
这不是错误。参数的类型是const int*&
,它是对非const的引用,它不能绑定到具有不同类型(int*
)的对象。 (需要隐式转换,并且生成的临时转换不能绑定到非const引用。)
如果更改参数的类型以引用const:
void foo(const int* const&)
或者将参数的类型更改为const int*
:
const int* i=nullptr;
foo(i);
两者都会因模糊调用而触发编译错误。
- 有没有办法打电话给第二个版本? (如果这不是错误)
你可以通过一个函数指针来完成它,明确指定你要选择哪一个:
const int* i=nullptr;
static_cast<void(*)(const int*&)>(&foo)(i);