C++ 将指针传递给带有引用参数的函数
通常,这是由编译器捕获的。但是使用对函数指针的强制转换,我们可以做到这一点 我的措辞可能不恰当,以下是一个更好地说明我的问题的例子:C++ 将指针传递给带有引用参数的函数,c++,pointers,reference,parameter-passing,C++,Pointers,Reference,Parameter Passing,通常,这是由编译器捕获的。但是使用对函数指针的强制转换,我们可以做到这一点 我的措辞可能不恰当,以下是一个更好地说明我的问题的例子: void printintp(int *ip) { printf("pointer = %p\n", ip); printf("*pointer = %d\n", *ip); } void printint(int &i) { printf("int = %d\n", i
void printintp(int *ip)
{
printf("pointer = %p\n", ip);
printf("*pointer = %d\n", *ip);
}
void printint(int &i)
{
printf("int = %d\n", i);
}
int main()
{
int a = 555;
//int &irp = &a; // ERROR 1
void (*f)(void *);
//printint((int &) &a); // ERROR 2
f = (void (*)(void *))printintp;
f(&a);
f = (void (*)(void *))printint;
//printint(&a); // ERROR 3 (invalid conversion of `int *` to `int`)
f(&a); // GOOD (why?)
return 0;
}
结果当然是人们所期望的:
pointer = 0x7ffd01995bf4
*pointer = 555
int = 555
因此,我的问题细化为:为什么要将指针&a
传递给期望函数printint
的对象?这种未定义的行为是否恰好适用于我的实现?如果不是,如果我们只是传递其地址,参数int&i
如何绑定到对象a
,为什么它拒绝我标记为错误2
PS:在这个问题上我能找到的最好的说法是声称printintp
和printint
在功能上是“相同的”,尽管在实践中,函数调用是不同的(printintp(&a)
和printint(a)
)
PS2:请注意,我不是在问指针和引用之间的区别,这已经解释得很清楚了
这种未定义的行为是否恰好适用于我的实现
对。大多数编译器使用隐藏的指针实现引用,但这并不是由标准规定的
标准语法不允许指针按原样分配给引用,反之亦然,因此这些语句上会出现编译器错误
将所有内容都掷到无效*
,所有赌注都押在类型安全上。使用a,你几乎可以逃避任何事情。你基本上是在告诉编译器你知道你在做什么,所以它应该接受它并保持安静。这就是为什么当您不知道自己真正在做什么时,这种类型转换可能是危险的,除非绝对必要,否则应该避免。如果必须强制转换,请选择C++样式的类型强制转换,而不是(、等)。至少这样,您不会放弃太多的类型安全性
这种未定义的行为是否恰好适用于我的实现
对。大多数编译器使用隐藏的指针实现引用,但这并不是由标准规定的
标准语法不允许指针按原样分配给引用,反之亦然,因此这些语句上会出现编译器错误
将所有内容都掷到无效*
,所有赌注都押在类型安全上。使用a,你几乎可以逃避任何事情。你基本上是在告诉编译器你知道你在做什么,所以它应该接受它并保持安静。这就是为什么当您不知道自己真正在做什么时,这种类型转换可能是危险的,除非绝对必要,否则应该避免。如果必须强制转换,请选择C++样式的类型强制转换,而不是(、等)。至少这样,您不会放弃太多的类型安全性