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

Avi*_*ash 6 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;
}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 6

为什么在C++中不允许跟随?
原因与编译器提供的编译错误完全相同:
因为它们不明确!

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

这些重载方法背后的基本原理是什么?
编译器不知道调用者是否想要将传递的参数的视为const否,编译器无法使用手头的信息来确定.

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

以下示例给出了上述解释的更清晰的想法.

在线样本:

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


int main() 
{
     Sample s;
     return 0;
}
Run Code Online (Sandbox Code Playgroud)


jua*_*nza 5

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

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

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

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

class Sample {
public:
  void Method(char& x) {}
  void Method(const char& x) {}
};
Run Code Online (Sandbox Code Playgroud)

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