具有指针参数的函数中的绑定错误
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 ]
用这种方式编写代码时...
#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 ]