c ++中的ambigious函数

ora*_*xel 5 c++ overloading

我想知道为什么这些声明不起作用(不兼容)

void f(int); //p1
void f(const int);//p2
void f(int &);//p3
void f(const int &);//p4
Run Code Online (Sandbox Code Playgroud)

如果我理解得很好,编译器将找不到(int&)和(const int&)之间的区别,如果我写f(12)它将无法在两个第一个声明之间进行选择.我是对的?

Xeo*_*Xeo 7

p3和p4完全明确且可区分,p1和p2不是.(当然p1/p2与p3和p4不同.)

原因是const值参数的顶级在声明中无法检测到并且实际上无用.例如,您可以执行以下操作:

void foo(int x); // declaration
// ...
void foo(const int x){
  // definition/implementation
}
Run Code Online (Sandbox Code Playgroud)

const是一个对调用者来说并不重要的实现细节,因为您无论如何都要制作副本.该副本也是它无法区分的原因int,从呼叫方来看它完全相同.

请注意,const int& r没有顶级const,它是引用常量整数的引用(引用始终是常量).对于指针,如果没有声明可能会更改const,请参阅此问题以获取放置位置const.