为什么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;
}
答案 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
的引用(而不是const
对char
的引用)。
答案 2 :(得分:3)
说到功能参数,char
和char const
是相同的数据类型。
答案 3 :(得分:3)
这仍然含糊不清。当使用字符参数调用它时,一个版本将复制参数并说“好的,您可以更改副本”。另一个将复制参数并说“好的,你不能改变副本”。编译器如何知道它是否可以更改某些内容的副本?它可以做得很好。
答案 4 :(得分:2)
因为它含糊不清 当你像这样传递时
s.Method('x');
您认为应该调用哪个版本?
答案 5 :(得分:2)
标准说这两个声明是等价的(13.1.3):
仅在
const
和/或volatile
存在或不存在时不同的参数声明是等效的。也就是说,在确定声明,定义或调用哪个函数时,将忽略每个参数类型的const
和volatile
类型说明符。
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 表示该变量具有设定值,所以在声明后不能更改。它不是一种不同的数据类型。