使用一个参数const进行C ++重载

时间:2012-05-14 11:29:55

标签: c++

为什么C++

中不允许关注
#include <iostream>

class Sample {
public:
  void Method(char x);
  void Method(char const x);
};

void Sample::Method(char x) {
  char y = x;
}

void Sample::Method(char const x) {
  char y = x;
}

int main() {
  Sample s;
  return 0;
}

7 个答案:

答案 0 :(得分:6)

为什么在C ++中不允许关注?
原因与编译器提供的编译错误完全相同:
因为它们含糊不清!

为什么这些方法含糊不清?
简短回答:因为C ++标准这么说。

这些重载方法背后隐含的理由是什么?
编译器不知道调用者是否想要将传递的 参数的 值视为const,编译器无法确定随着手头的信息。

注意这里强调 按值传递 ,参数是通过值传递的,因此是模糊性。如果参数 通过引用传递 ,那么编译器肯定知道调用者如何处理参数,因为实际的对象本身正在被传递,因此编译器可以使选择适当的过载。

以下示例更清楚地了解上述说明。

<强> Online Sample

class Sample 
{
    public:
        void Method(char &x){}
        void Method(char const x){}
        void Method(char const &x){}
};


int main() 
{
     Sample s;
     return 0;
}

答案 1 :(得分:5)

它并没有真正回答为什么,但它是由标准决定的,§1.3.10

  

有关参与重载决策的函数的信息(13.3):其参数的类型   并且,如果函数是类成员,则函数本身的cv限定符(如果有)和声明成员函数的类。

这只是意味着在重载决策中忽略了参数的cv限定符。

带引用的类似(但等效)示例有效:

class Sample {
public:
  void Method(char& x) {}
  void Method(const char& x) {}
};

因为这里的类型不同,第一种情况是对char的引用,第二种情况是对const char的引用(而不是constchar的引用)。

答案 2 :(得分:3)

说到功能参数,charchar const是相同的数据类型。

答案 3 :(得分:3)

这仍然含糊不清。当使用字符参数调用它时,一个版本将复制参数并说“好的,您可以更改副本”。另一个将复制参数并说“好的,你不能改变副本”。编译器如何知道它是否可以更改某些内容的副本?它可以做得很好。

答案 4 :(得分:2)

因为它含糊不清 当你像这样传递时

s.Method('x');

您认为应该调用哪个版本?

答案 5 :(得分:2)

标准说这两个声明是等价的(13.1.3):

  

仅在const和/或volatile存在或不存在时不同的参数声明是等效的。也就是说,在确定声明,定义或调用哪个函数时,将忽略每个参数类型的constvolatile类型说明符。

typedef const int cInt;

int f(int);
int f(const int);            // redeclaration of f(int)
int f(int) { /* ... */ }     // definiton of f(int)
int f(cInt) { /* ... */ }    // error: redefiniton of f(int)

答案 6 :(得分:0)

http://duramecho.com/ComputerInformation/WhyHowCppConst.html

因为 const 表示该变量具有设定值,所以在声明后不能更改。它不是一种不同的数据类型。