我可以重载一个带引号或变量名的函数吗?
例如,当我尝试这样做时:
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)
我想编写pass-by-reference函数以便更好地使用内存并可能在范围之外操作变量,但是不必创建新变量就可以调用该函数。
这可能吗?
干杯
答案 0 :(得分:8)
我认为你在这里忽略了这一点。你应该拥有的只是这个:
void function(const double &a);
注意“const”。有了这个,你应该总是得到传递参考。如果你有非const通过引用传递,那么编译器将正确地假设您希望修改传递的对象 - 当然这在概念上与传值的变体不兼容。
使用const引用,编译器将很乐意为您创建临时对象。非const版本不适合您,因为编译器只能将这些临时文件创建为“const”对象。
答案 1 :(得分:1)
我试过了,但失败了
至少在MSVC2008中,这是不可能的 - 我认为这适用于所有c ++ - 编译器。
定义本身有效,但在尝试调用函数时
function(a);
将变量作为参数,会引发编译器错误,因为编译器无法确定要使用的函数。
答案 2 :(得分:1)
void function(double const &a); // instead of void function(double a);
void function(double &a);
答案 3 :(得分:0)
我不认为定义:
void function(double a);
void function(double &a);
是可能的......编译器如何知道为function(x)
调用哪个函数?
如果要同时使用Reference和Value,则应使用两个不同的函数。这也会使代码比这种模糊的重载更容易阅读。
答案 4 :(得分:0)
通过引用传递POD类型没有任何好处,因为它们几乎总是(总是?)在注册表中传递。 通过const引用传递的复杂类型(由多于一个POD变量组成的复杂类型)通常(总是?:D)是复制和堆栈推送的一种可预见的方式。 您甚至可以通过创建explicit constructors
来控制从POD类型创建复杂类型变量的临时值答案 5 :(得分:-1)
不,你不能这样做因为这两个函数都会有效地产生相同的错位名称,并且链接器将无法解析函数调用。