C++ 将指针传递给期望引用的函数会更改所指向的值
我有下面的代码示例。我正在将指针传递给一个函数。当我将指针传递给函数时,函数似乎将参数初始化为某个随机数。但是,当我将变量的地址传递给函数时,它会给出预期的结果C++ 将指针传递给期望引用的函数会更改所指向的值,c++,pointers,boost,bind,C++,Pointers,Boost,Bind,我有下面的代码示例。我正在将指针传递给一个函数。当我将指针传递给函数时,函数似乎将参数初始化为某个随机数。但是,当我将变量的地址传递给函数时,它会给出预期的结果 // find_if example #include <iostream> // std::cout #include <algorithm> // std::find_if #include <vector> // std::vector class A { publ
// find_if example
#include <iostream> // std::cout
#include <algorithm> // std::find_if
#include <vector> // std::vector
class A
{
public:
A(int i) { num = i; }
bool IsPresent (A& a) {
std::cout << "Comparing " << num << " vs " << a.num << '\n';
return (num == a.num);
};
int num;
};
int main () {
std::vector<A*> myvector;
A a1(10);
A a2(20);
A a3(30);
A a4(40);
A a(40);
const A *pa = &a;
std::cout << "pa is " << pa << '\n';
myvector.push_back(&a1);
myvector.push_back(&a2);
myvector.push_back(&a3);
myvector.push_back(&a4);
std::vector<A*>::iterator it = std::find_if (myvector.begin(), myvector.end(),
std::bind2nd(std::mem_fun(&A::IsPresent), pa));
if (it != myvector.end())
std::cout << "The first equal value is " << (*it)->num << '\n';
else
std::cout << "Cannot find a match";
return 0;
}
当作为引用传递时:
pa is 0x75002e9dbb30
Comparing 10 vs 40
Comparing 20 vs 40
Comparing 30 vs 40
Comparing 40 vs 40
The first equal value is 40
当参数通过指针传递时,为什么函数bool IsPresent(A&A)会将变量(A&A)初始化为随机值,而当我传递参数的引用时,函数会工作? “A&A”参数定义为引用变量,当您传递指针对象时,它试图将对象解释为引用。正确的方法是传递其内容 为了改进您的解决方案,您可以将isPresent定义为bool isPresent(const A&A) 为什么代码首先要编译?我正在调用的函数需要一个引用,我正在传递一个指针。编译器不应该因为找不到函数而发出警告/错误吗? 它可能被错误地解释为参考。因此,它可以正确编译,但执行失败。
如果您忘记取消引用
pa
会生成一条非常简单易读的编译器错误消息。@Someprogrammerdude什么?否。它可能是类型错误,也可能不是。不允许UB将类型化有效参数传递给类型化函数签名。还是说bind 2nd疯了?三个问题:提升使用在哪里?您使用C++11之前的绑定代码是有原因的吗?你用的是什么编译器?这是一段旧代码。我不知道当时的开发人员为什么没有使用boost。GCC编译器,C++11之前版本。这是什么编译器?即使在使用isPresent(const A&A)时也是一样的问题。此外,即使常数“a”被初始化为随机值,常数的改进也是为了避免修改引用
pa is 0x75002e9dbb30
Comparing 10 vs 40
Comparing 20 vs 40
Comparing 30 vs 40
Comparing 40 vs 40
The first equal value is 40
template< class F, class T >
std::binder2nd<F> bind2nd( const F& f, const T& x )
std::binder2nd<F>(f, typename F::second_argument_type(x))
std::vector<A*>::iterator it = std::find_if (
myvector.begin(), myvector.end(),
[pa](A* a){ a->IsPresent(*pa); }
);