可能重复:
带有 const 参数和重载的函数
我对重载和 const 声明规则感到很困惑。这里有两件事让我感到困惑,也许你可以帮助我找到我脑海中更深层次的误解,导致他们对我感到困惑。;)
首要问题:
我的编译器允许这样做:
void f(int & x) {
std::cout << "plain f" << std::endl;
}
void f(const int & x) {
std::cout << "const f" << std::endl;
}
但是以下会导致编译错误(函数已经有一个主体):
void f(int x) {
std::cout << "plain f" << std::endl;
}
void f(const int x) {
std::cout << "const f" << std::endl;
}
我认为这是有道理的,因为我认为 const 只是在那里告诉编译器正在传递的对象没有改变,而在第二种情况下它无论如何都会被复制。但如果这是正确的,那么为什么我可以使用 const 重载函数?
换句话说,为什么如果我使用编译版本并调用这样的函数:
int x1 = 5;
const int x2 = 5;
f(x1);
f(x2);
我得到“plain f”和“const f”而不是“const f”两次?显然现在我也使用 const 来告诉编译器调用哪个函数,不仅引用不会改变。这变得更加令人困惑,因为如果我删除“普通”版本,它就可以正常工作并两次调用“const”版本。
现在我的实际问题是什么?我想知道这种行为背后的想法是什么,因为否则很难记住它。