C++ 仅用返回值const与否来区分的重载函数?

最近又在用thrust,发现了一点有意思的东西。

thrust::host_vector的实现中貌似存在着一对仅仅靠返回值类型来区分的函数,如下:

pointer data(void)
const_pointer   data(void)  const

众所周知,“C++中的函数重载仅仅依靠函数形参列表来区分,返回值不能区分重载函数”。那么这两个显然是合法的、形参列表是void函数又如何解释?

除去返回值,两个函数还有一处不同:后缀const,此后缀表示本函数不修改本对象的数据,只进行只读访问。一番搜索之后,在这里找到了答案:

下面谈论一个比较恶心的问题,基于const的重载。

��类中会有这样一种重载,它是合法的。

Class A {
int function ();
int function () const;
};
可以看到在A类中,function函数是发生重载了,而且是合法的。而且在调用时,只用A类的const对象才能调用const版本的function函数,而非const对象可以调用任意一种,通常非const对象调用不是const版本的function函数。

��因是:按照函数重载的定义,函数名相同而形参表有本质不同的函数称为重载。在类中,由于隐含的this形参的存在,const版本的function函数使得作为形参的this指针的类型变为指向const对象的指针,而非const版本的使得作为形参的this指针就是正常版本的指针。此处是发生重载的本质。重载函数在最佳匹配过程中,对于const对象调用的就选取const版本的成员函数,而普通的对象调用就选取非const版本的成员函数。 (注:this指针是一个const指针,地址不能改,但能改变其指向的对象或者变量)

可以看出,返回值确实在区分重载函数时完全不起作用,因为以上例子中两个函数的返回值都是int。起作用的,实质上是因为后缀const而被隐式加入函数签名的const this指针,说到底,还是依靠形参区分。

第一眼在IDE里面看到两个data函数的声明时,后缀const被IDE隐藏了,看到这俩函数简直毁三观啊。

  • 最后更改: 2019/05/27 13:20