在l值上重载a

时间:2014-04-08 04:45:20

标签: c++ overloading

如何调用第二个(重载)函数? (这个例子出现在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.

3 个答案:

答案 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);