const T*& 和 const T* 不会在函数重载时产生歧义

const T*& and const T* do not produce ambiguity on function overload


#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

  • Why the following sample code do not produce ambiguity

这不是错误。参数的类型是const int*&,它是对非常量的引用,不能绑定到不同类型的对象(int*)。 (需要隐式转换,并且生成的临时对象不能绑定到对非常量的引用。)

如果将参数的类型更改为对 const 的引用:

void foo(const int* const&)

或将参数类型更改为 const int*:

const int* i=nullptr;
foo(i);

两者都将触发歧义调用的编译错误。

  • Is there any way to call the second version? (If this is not a bug)

您可以通过一个函数指针来完成,明确指定您要选择哪一个:

const int* i=nullptr;
static_cast<void(*)(const int*&)>(&foo)(i);