具有指针参数的函数中的绑定错误

Binding errors in functions with pointer parameters

用这种方式编写代码时...

#include<bits/stdc++.h>
using namespace std;

class Node {
public:
    int data;

    Node(int data) {
        this->data = data;
    }
};

void display(const Node* &p){
    cout<<p->data<<endl;
}

int main(){
    Node *p = new Node(10);
    display(p);
    return 0;
}

我收到以下错误。

error: cannot bind non-const lvalue reference of type 'const Node*&' to an rvalue of type 'const Node*'

但是,如果将函数 display 的参数 const Node* &p 更改为 Node* &p

谁能给我解释一下这是怎么回事?

p 是一个 Node *,不能直接绑定到 const Node* &。它需要先转换为const Node*,这是一个临时的,即右值,不能绑定到lvaue-reference to non-const.

更改为 Node* & 修复了问题,p 可以直接绑定到 Node* &,无需任何隐式转换。

BTW 临时对象可以绑定到 const 的左值引用。将参数类型更改为 const Node* const & 效果很好。 LIVE

或者从按引用传递更改为按值传递(指针本身),如 const Node*LIVE

const Node* &p
// p is a reference to a pointer to a constant 'Node'

而你拥有的是

Node *p
//  ^^ discarding the const qualifier is an error
display(p);
//      ^^ error

可能最简单的解决方法就是兑现承诺

const Node *p = new Node(10);
//^^^
display(p); // OK

void display(const Node*& p)

基本相同
void display(const Node** p)

并且该标准有一个很好的例子说明为什么不允许使用(非常量)Node** 初始化它 (n4659 [conv.qual]):

// [ Note: If a program could assign a pointer of type T** to a pointer of type const T** (that is, if line #1
// below were allowed), a program could inadvertently modify a const object (as it is done on line #2). For
// example,
int main() {
  const char c = 'c';
  char* pc;
  const char** pcc = &pc; // #1: not allowed
  *pcc = &c;
  *pc = 'C'; // #2: modifies a const object
}
// — end note ]