知道函数是否在运行时获取引用或值

时间:2010-08-22 08:47:01

标签: c++ c reference

所以这是一个纯粹的学术问题,因为我已经做了一段时间,因为我在C ++中做了太复杂的事情。但有没有办法知道一个方法是否将参数作为参考或值?这对指针来说并不重要,就好像你试图将非指针传递给一个带指针的方法一样,你得到一个编译错误。但是像

这样的东西

int someFunction(int &x){

x = 0

return x;

}

int main(){

int v = 4;

int l = someFunction(v);

我意识到通过将v声明为const可以避免这种情况。但我只是想知道是否有一种方法可以在运行时知道someFunction是在接受引用还是值?

标记为C和C ++,处理此问题的方式有何不同?

我对C的错误。自从我在C中工作已经很长时间了,我已经忘记了边界的确切位置,lol

4 个答案:

答案 0 :(得分:2)

是。在任何语言中,都可以创建一个函数,该函数根据函数是使用pass-by-value还是pass-by-reference返回不同​​的结果。这不应该用于日常编程,但它对于测试编译器,测试API等很有用。基本上,使用初始化为某个值的变量调用函数,并在函数中,分配参数的值不同。在调用者中,在调用函数后检查参数的值,以查看突变是否具有可见效果。请注意,我假设您已经写了调用者和被调用者。

如果要检查一些您无法控制的任意函数,可以使用函数重载来告诉您正在使用的参数传递方案类型:

bool IsPassingByReference(int (*func)(int)) { return false; }
bool IsPassingByReference(int (*func)(int&)) { return true; }

如前所述,这仅适用于C ++。 (C有指针,但没有引用)。

答案 1 :(得分:1)

如果你传递了一些非基本类型(例如int,char等),而是某个类的实例,你可以修改该类的copy-constructor,以便在复制时打印一些东西。

现在,如果函数使用了一个值,那么在调用该函数时将调用复制构造函数,如果它使用引用,则不会复制,也不会调用复制构造函数。

您可以检查该打印输出是否存在,以确定该功能是使用了值还是参考。

答案 2 :(得分:0)

AFAIK在运行时无法知道这一点。或者在编译时就此问题。 C ++不是这种方式构建的。你应该查看“反思” - 程序了解自己结构的能力。 C ++还没有得到它,例如Java。

C没有参考。

答案 3 :(得分:0)

这个问题看起来有点奇怪。您希望在运行时了解编译时已知的内容。所以,someFunction的直接答案是:是的,它的参数是引用,因为它是引用。这在编译和运行时都是已知的。这类问题通常由模板编写者提出,他们需要在编译时检测参数类型。

通常C ++程序员在编译时尝试尽可能多地做,并且你想在运行时做一些可以在编译时完成的事情。