我用同样的参数列表重载运营商的两倍。 但具有不同的返回类型:
T& operator()(par_list){blablabla}
const T& operator()(par_list){blablabla}
所以,当我打电话()运算符,它的功能将基于什么样的偏好或情况叫什么名字? 我知道,如果我叫()const的下功能它必须是const的T&之一。
我只是好奇,C ++如何应对这样的状况,以及如何默认的首作品。
谢谢
我用同样的参数列表重载运营商的两倍。 但具有不同的返回类型:
T& operator()(par_list){blablabla}
const T& operator()(par_list){blablabla}
所以,当我打电话()运算符,它的功能将基于什么样的偏好或情况叫什么名字? 我知道,如果我叫()const的下功能它必须是const的T&之一。
我只是好奇,C ++如何应对这样的状况,以及如何默认的首作品。
谢谢
这些函数不重载对方; 它们具有相同的特征,所以试图重新定义相同的功能,这是一个错误。 返回类型不是函数签名的一部分。 过载功能,您必须声明具有相同名称的第二功能,但不同的参数或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
你不能重载基于返回类型的函数/方法。 我希望编译器在这里抛出一个错误。 你可以做的就是指定方法本身作为一个const
方法,使用
const T& operator()(par_list) const {blahblah}
该const
预选赛不仅意味着这可以在一个被称为const
接收器,但它也是在重载使用。 这是因为它影响到隐*this
参数传递给此方法; 一个const
方法使用const
上限定符*this
,和const
限定符重载解析过程中加以考虑。
定义你的经营方式,没办法编译器可以决定()调用哪个运营商。 功能(和运营商)重载只能在自变量的类型进行,从未返回类型。 而事实上,你只要你定义了第二个,编译器考虑到你正在重新定义相同的功能/操作员必须在编译错误。
但是,以下是常见的(也可能是你所拥有的):
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&