c++ - c++中的模糊函数

标签 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) 它将无法在两个第一个声明之间进行选择.. 我说得对吗?

最佳答案

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 的位置。

关于c++ - c++中的模糊函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10122294/

相关文章:

c++ - 对于 Boost.Propertytree,有什么方法可以使用 JSON 点符号来引用数组元素?

c++ - 如何锐化 rnd 生成器

c++ - 通过参数返回值是一个好的设计吗?

c++ - 替代 ->operator()

c++ - Widevine session 更新无限循环

c++ - vector 中的指针问题

c11 _Generic 添加类型

overloading - 如何估算方法重载?

c++ - 如何使用数组重载 ostream 运算符<<?

c++ - 可变函数重载和 SFINAE - 解决歧义以模拟 "hide by signature"