如何防止我函数的调用方在 C++ 中使用相同的按引用传递变量?
How can I prevent caller to my function from using the same pass-by-reference variable in C++?
我有一个遗留接口,它的函数签名如下所示:
int provide_values(int &x, int &y)
x
和 y
被视为此函数中的输出参数。 注意:我知道使用输出参数的缺点,并且对于这样的接口有更好的设计选择。我不想争论这个界面的优点。
在这个函数的实现中,它首先检查两个输出参数的地址是否相同,如果相同returns一个错误代码。
if (&x == &y) {
return -1; // Error: both output parameters are the same variable
}
有没有办法在编译时阻止此函数的调用者为两个输出参数提供相同的变量,而无需在函数体内进行此类检查?我正在考虑类似于 C 中的 restrict
关键字的东西,但这只是编译器进行优化的信号,并且在编译调用此类函数的代码时仅提供 warning
指针。
不,没有。请记住,调用代码可以从某些任意黑盒函数返回的引用派生 x
和 y
。但即便如此,编译器不可能(根据不完备性定理)可靠地确定它们是否指向同一个对象,因为它们绑定到什么对象是由程序的执行决定的。
如果您只想防止用户调用 provide_values(xyz, xyz)
,您可以使用宏,如下例所示。但是,这并不能保护用户免于调用 provide_values(xyz, reference_to_xyz)
,因此整个过程可能毫无意义。
#include <cstring>
void provide_values(int&, int&) {}
#define PROV_VAL(x, y) if (strcmp((#x),(#y))) { provide_values(x, y); } else { throw -1; }
int main()
{
int x;
int y;
PROV_VAL(x,y);
//PROV_VAL(x,x); // this throws
int& z = x;
PROV_VAL(x,z); // this passes though!
}
我有一个遗留接口,它的函数签名如下所示:
int provide_values(int &x, int &y)
x
和 y
被视为此函数中的输出参数。 注意:我知道使用输出参数的缺点,并且对于这样的接口有更好的设计选择。我不想争论这个界面的优点。
在这个函数的实现中,它首先检查两个输出参数的地址是否相同,如果相同returns一个错误代码。
if (&x == &y) {
return -1; // Error: both output parameters are the same variable
}
有没有办法在编译时阻止此函数的调用者为两个输出参数提供相同的变量,而无需在函数体内进行此类检查?我正在考虑类似于 C 中的 restrict
关键字的东西,但这只是编译器进行优化的信号,并且在编译调用此类函数的代码时仅提供 warning
指针。
不,没有。请记住,调用代码可以从某些任意黑盒函数返回的引用派生 x
和 y
。但即便如此,编译器不可能(根据不完备性定理)可靠地确定它们是否指向同一个对象,因为它们绑定到什么对象是由程序的执行决定的。
如果您只想防止用户调用 provide_values(xyz, xyz)
,您可以使用宏,如下例所示。但是,这并不能保护用户免于调用 provide_values(xyz, reference_to_xyz)
,因此整个过程可能毫无意义。
#include <cstring>
void provide_values(int&, int&) {}
#define PROV_VAL(x, y) if (strcmp((#x),(#y))) { provide_values(x, y); } else { throw -1; }
int main()
{
int x;
int y;
PROV_VAL(x,y);
//PROV_VAL(x,x); // this throws
int& z = x;
PROV_VAL(x,z); // this passes though!
}