【问题标题】:Why these two functions cannot be overloaded? [duplicate]为什么这两个函数不能重载? [复制]
【发布时间】:2016-06-18 12:32:33
【问题描述】:

为什么我不能重载这两个函数?

#include <iostream>
using namespace std;

class Base
{
    public:
    void run(int a);
    void run(const int a);
};
int main() {
    // your code goes here
    return 0;
}

输出:

prog.cpp:8:7: error: 'void Base::run(int)' cannot be overloaded
  void run(const int a);
       ^
prog.cpp:7:7: error: with 'void Base::run(int)'
  void run(int a);

【问题讨论】:

  • 编译器将如何决定int 是否应该是const
  • 常量和非常量没有区别
  • @EdHeal 从某种意义上说,它可以(如果标准会这么说,但它没有)。例如,将右值视为真正的常量(在const/非const 引用的情况下,它确实),并推断左值的常量(毕竟,编译器知道哪些左值标记为const)。是否存在其他可能出现的模棱两可的情况?但这会使已经非常重要的重载规则变得更加复杂。
  • @vsoftco 无论如何都会复制该值,参数的常量与参数的常量无关。不像对非 const 的引用,其中传递 const 参数的格式不正确。
  • @Oktalist 值被复制的事实不会阻止编译器将constnon-const 区分开来。事实上,在函数定义编译器中是这样做的:void f(const int a) { a = 0; } 是一个错误。

标签: c++ overloading


【解决方案1】:

按照标准:

13.1 可重载声明
....

(3.4) — 仅在 const 和/或 volatile 存在或不存在方面不同的参数声明是 相等的。也就是说,每个参数类型的 constvolatile 类型说明符在 确定正在声明、定义或调用哪个函数。 [示例

   typedef const int cInt;
   int f (int);
   int f (const int); // redeclaration of f(int)
   int f (int) { /* ... */ } // definition of f(int)
   int f (cInt) { /* ... */ } // error: redefinition of f(int)

结束示例 ]

只有在参数类型规范最外层的constvolatile 类型说明符 以这种方式被忽略; constvolatile 类型说明符隐藏在参数类型中 规范很重要,可用于区分重载的函数声明。在 特别是,对于任何类型 T,“指向 T 的指针”、“指向 const T 的指针”和“指向 volatile T 的指针”是 被视为不同的参数类型,如“引用T”、“引用const T”和“引用 volatile T。”

【讨论】:

  • 是的 run(cont int&amp;) 不等于 run(int&amp;)
  • 正如@juanchopanza 所说,当您引用时,这句话似乎并不适用。
  • @juanchopanza 是的,我不得不引用到最后,谢谢!
  • @StefanMonov 正确,扩展。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2011-05-18
  • 2021-12-11
相关资源
最近更新 更多