5

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

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

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

4

1 回答 1

7

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

原因是 value 参数的顶层const是不可检测的,实际上在声明中是无用的。例如,您可以执行以下操作:

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

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

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

于 2012-04-12T11:08:05.760 回答