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); }
    );