如何调用第二个(重载)函数? (这个例子出现在Savitch的C ++教科书中。)
(1)int& f(); // will be used in any l-value invocation
(2)const int& f() const; // will be used in any r-value invocation
我认为第一个是在(a)中调用的,第二个是在(b)中调用的。但事实并非如此。
(a)f() = 123; // the first one is invoked.
(b)f() + 3; // the first one is also invoked.
答案 0 :(得分:2)
只有成员函数可以是const。所以我们假设f实际上是教科书中的成员函数。
当编译器在const和非const成员函数之间进行选择时,如果必须,它将只使用const。这是调用函数的对象是const。
class A {
public:
int &f();
const int& f() const;
};
void func()
{
A a;
a.f(); // calls non const version
const A ca;
ca.f(); // call const version
}
答案 1 :(得分:1)
(1)int& F(); //将用于任何l值调用
(2)const int& f()const; //将用于任何r值调用
这些评论是错误的。如果它们出现在教科书中,那么我建议你买一本不同的教科书。
当表示对象的表达式具有2
类型时,将使用版本const
,否则使用版本1
。它与lvalues和rvalues完全没有关系。使用Eelke的课程定义:
A().f(); // invokes (1) on an rvalue
A const a;
a.f(); // invokes (2) on an lvalue
在您的示例中,您实际上并未显示您是否正在使用const
实例,但根据您的结果判断,两者都必须是非常规实例。
答案 2 :(得分:0)
重载在函数参数上工作,而不是返回类型。
double f();
int f();
这些没有超载。
但这些是:
double f();
int f(int);