c ++中的模糊函数

时间:2012-04-12 11:05:36

标签: c++ overloading

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

void f(int); //p1
void f(const int);//p2
void f(int &);//p3
void f(const int &);//p4

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

1 个答案:

答案 0 :(得分:7)

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

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

void foo(int x); // declaration
// ...
void foo(const int x){
  // definition/implementation
}

这里的const是一个对调用者来说并不重要的实现细节,因为你无论如何都要制作副本。该副本也是为什么它与int无法区分的原因,从调用方那边完全相同

请注意const int& r没有顶级const,它是引用常量整数的引用(引用始终是常量)。对于指针,如果未声明const,则可能会更改指针,另请参阅this question,了解放置const的位置。