C ++运算符重载两次,一次返回非const引用和其他const引用,有什么偏好?(C++ over

2019-08-01 02:42发布

我用同样的参数列表重载运营商的两倍。 但具有不同的返回类型:

T& operator()(par_list){blablabla}    
const T& operator()(par_list){blablabla}

所以,当我打电话()运算符,它的功能将基于什么样的偏好或情况叫什么名字? 我知道,如果我叫()const的下功能它必须是const的T&之一。

我只是好奇,C ++如何应对这样的状况,以及如何默认的首作品。

谢谢

Answer 1:

这些函数不重载对方; 它们具有相同的特征,所以试图重新定义相同的功能,这是一个错误。 返回类型不是函数签名的一部分。 过载功能,您必须声明具有相同名称的第二功能,但不同的参数或const / volatile预选赛-也就是说,在功能上,而不是返回类型预选赛。

(他们不互相覆盖或者,压倒一切的是什么派生类做自己的基类的虚拟函数)。

这是常见的,以限定一个const和非const成员函数的过载; 该const超载必须声明函数const ,不只是返回类型:

T& operator()(par_list){blablabla}
const T& operator()(par_list) const {blablabla}
                              ^^^^^

现在,如果你申请的第一个会被称为()以非const对象,第二个是关于const对象。 例如:

Thingy nc;
Thingy const c;

nc(); // calls the first (non-const) overload
c();  // calls the second (const) overload


Answer 2:

你不能重载基于返回类型的函数/方法。 我希望编译器在这里抛出一个错误。 你可以做的就是指定方法本身作为一个const方法,使用

const T& operator()(par_list) const {blahblah}

const预选赛不仅意味着这可以在一个被称为const接收器,但它也是在重载使用。 这是因为它影响到隐*this参数传递给此方法; 一个const方法使用const上限定符*this ,和const限定符重载解析过程中加以考虑。



Answer 3:

定义你的经营方式,没办法编译器可以决定()调用哪个运营商。 功能(和运营商)重载只能在自变量的类型进行,从未返回类型。 而事实上,你只要你定义了第二个,编译器考虑到你正在重新定义相同的功能/操作员必须在编译错误。

但是,以下是常见的(也可能是你所拥有的):

T& operator()(par_list){blablabla}
const T& operator()(par_list) const {blablabla}

这种额外的“常量”参数列表后存在,因为你定义的非静态成员函数和成员函数有一个隐含的隐藏论点:“此”指针类的实例。 “常量”关键字有指示,如果这个隐藏指针是一个const实例或不是。 这种说法参与到重载的分辨率,这是在这种情况下,什么样的编译器使用来选择使用哪个运营商的版本。

所以:

class A {
    T& operator()() { ... }
    const T& operator()() const { .... }
};

A a;
const A& ca(a);
a(); -> returns a T&
ca(); -> returns a const T&


文章来源: C++ overload operator twice, one return non-const reference and the other const reference, what is the preference?