在 C Primer 第五版中,进行了以下区别:
int f(int){ /* can write to parameter */} int f(const int){ /* cannot write to parameter */}
虽然这两个函数看起来没有区别,它们确实在更新参数的能力上有所不同。然而,它们在函数签名中仍然是可区分的。
这种不区分的原因在于基于值的参数的“按值传递”性质。当一个对象传递给函数时,会创建一个副本,它是函数内修改的实际参数。顶层的 const 限定符不会影响副本的值,因为副本不是 const const。因此,从调用者的角度来看,两个函数具有相同的效果。
函数的重载是基于调用者提供的参数。参数的常量性不会改变被调用函数提供的功能,因此基于它改变实现是没有逻辑意义的。考虑以下代码:
f(3); int x = 1 + 2; f(x);
无论有或没有 const 限定符,函数 f() 在两种情况下都应表现相同。提供不同的实现可能会导致混乱和错误。
与基于值的参数相比,引用通过对实际对象的引用传递,而不是副本。这允许基于引用的常量性进行重载,并允许通过函数调用传递常量性。例如:
const T& f(const F&); T& f(F&);
此处,实现可能会有所不同,具体取决于参数是通过 const 引用还是非常量引用传递。
尽管函数签名缺乏区别,但有一种方法可以通过使用 const 引用来模拟所需的行为:
T f(F& x_ref) { F x = x_ref; // or const F if you won't modify it ...use x for safety... }
通过将参数作为 const 引用传递,编译器将禁止对参数进行任何修改。这在提供类似接口的同时确保了安全。
以上是为什么 C 不区分值类型的函数签名中的'const”和非'const”参数?的详细内容。更多信息请关注PHP中文网其他相关文章!