为什么不允许跟随 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)
为什么在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)
它并没有真正回答为什么,但它是由标准§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).
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |