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

时间:2016-10-21 15:44:55

标签: c++ pointers reference overloading overload-resolution

  • 为什么以下示例代码不会产生歧义
  • 有没有办法打电话给第二个版本? (如果这不是错误)
#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

1 个答案:

答案 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);