7

我可以重载一个接受引用或变量名的函数吗?

例如,当我尝试这样做时:

void function(double a);
void function(double &a);

我希望这个函数的调用者能够做到:

double a = 2.5;
function(a); // should call function(double &a)
function(2.3); // should call function(double a)

我想编写传递引用函数以更好地使用内存并可能在范围外操作变量,但不必创建一个新变量就可以调用该函数。

这可能吗?

干杯

4

6 回答 6

9

我认为你在这里错过了重点。你真正应该拥有的只是这个:

void function(const double &a);

注意“常量”。有了这个,你应该总是得到传递引用。如果您有非常量的按引用传递,那么编译器将正确地假定您希望修改传递的对象——这当然在概念上与按值传递变体不兼容。

使用 const 引用,编译器会很乐意在您背后为您创建临时对象。非 const 版本对您不起作用,因为编译器只能将这些临时对象创建为“const”对象。

于 2010-07-12T10:01:41.667 回答
1

我试过了,失败了

至少在 MSVC2008 中,这是不可能的 - 我认为这适用于所有 c++ - 编译器。

定义本身是有效的,但是在尝试调用函数时

function(a);

使用变量作为参数时,会引发编译器错误,因为编译器无法决定使用哪个函数。

于 2010-07-12T10:00:17.880 回答
1
void function(double const &a);  // instead of void function(double a);
void function(double       &a); 
于 2010-07-12T10:22:10.203 回答
0

我不认为定义:

void function(double a);
void function(double &a);

是可能的......编译器如何知道要调用哪个函数function(x)?如果你想同时使用引用和值,你应该使用两个不同的函数。这也将使代码比这种模棱两可的重载更容易阅读。

于 2010-07-12T09:56:39.540 回答
0

通过引用传递 POD 类型没有任何好处,因为它们几乎总是(总是?)在注册表中传递。通过 const 引用传递的复杂类型(由多个 POD 变量组成的类型)通常(总是?:D)是一种优于复制和堆栈推送的方式。您甚至可以通过创建显式构造函数来控制从 POD 类型创建复杂类型变量的临时变量

于 2010-07-12T12:22:03.610 回答
-1

不,你不能这样做,因为这两个函数都会有效地产生相同的错位名称,并且链接器将无法解析函数调用。

于 2010-07-12T10:17:10.053 回答