Redian新闻
>
引用的几个基本问题,有点糊涂
avatar
引用的几个基本问题,有点糊涂# Programming - 葵花宝典
s*y
1
void f(const int &a) {;}
void fpc(const int* &pa) {;}
void fp(int* &pa) {;}
int main()
{
int* pn, na[2], n = 1;
pn = &n;
f(n); // ok
fpc(pn); // error: invalid initialization of reference of type 'const int*&'
from expression of type 'int*'
fp(pn); // ok
fp(na); // error: invalid initialization of non-const reference of type 'int
*&' from a temporary of type 'int*'
}
请问上面这两个错的原因是什么?
f(n)和fpc(pn)之间有什么区别,除了改成传递指针变量之外
fp(pn)和fp(na)又有什么区别?
多谢指点
avatar
s*y
2
可能这个问题太弱了,不过也请帮忙解释一下,多谢了

&'

【在 s****y 的大作中提到】
: void f(const int &a) {;}
: void fpc(const int* &pa) {;}
: void fp(int* &pa) {;}
: int main()
: {
: int* pn, na[2], n = 1;
: pn = &n;
: f(n); // ok
: fpc(pn); // error: invalid initialization of reference of type 'const int*&'
: from expression of type 'int*'

avatar
m*n
3
这个问题一点也不弱:)
第一个问题可以归结为下面的问题:
const int * p;
int* & q = p;
或者
int *p;
const int * &q = p;
都是不允许的。q被认为是p的alias, 他们对指向内存的write access必须相同。
可能type theory里面有更深的原因。但是我能够想到的理由是,如果他们对
memory的访问权限不一样, 通过p或者q中的一个会改变同一个内存的值。
这样很容易产生bug。 所以编译器这样选择是合适的。
至于第二个问题:
当你call fp(na)的时候, 从错误信息看,compiler应该是从 int [] 创建了一个
temporary 的int *的变量。 但是由于你在fp被定义为传入一个int *&pa 而不是
int *const &pa的值,你可能改变这个临时变量的值, compiler认为这是不允许的。
compiler可以让你编译通过,但是这样会产生不可预料的后果。
解决第一个问题的办法是定义 pn 为const int *类型。
解决第二个问题的方法是定义fp为 void fp(int *con

【在 s****y 的大作中提到】
: void f(const int &a) {;}
: void fpc(const int* &pa) {;}
: void fp(int* &pa) {;}
: int main()
: {
: int* pn, na[2], n = 1;
: pn = &n;
: f(n); // ok
: fpc(pn); // error: invalid initialization of reference of type 'const int*&'
: from expression of type 'int*'

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。