作者jamod (jasper)
看板Programming
标题[问题] C++ constant reference的小疑问
时间Tue Aug 9 10:33:02 2016
小弟想请教一些观念性的问题,最近遇到一个错误是
int i = 1;
int *pi = &i;
const int *& rpci = pi; // error C2440: 'initializing': cannot convert from 'int *' to 'const int *&'
我对这段有段小疑惑,因为下面这段的写法是合法的
int i = 1;
const int &ci = i;
那为什麽换成constant pointer reference就不行呢?
上网查了一下,有得出下面可能发生的错误
const int i = 99;
int *pi;
const int*& rpci = pi; //if pass
rpci = &i;
*pi = 10;
如果允许const int* reference to int*,
那就可以透过pi来修改常数i,所以不给过...
但是我很好奇const int* 是否能reference一个int* ?
这样在语法上到底合不合法(虽然有隐患)?
因为const int Reference to int实际上是ok的,
所以我怀疑是不是VC++自己把我挡掉的?
麻烦请各位高手指点一下@@ 感谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.249.2.10
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Programming/M.1470709984.A.AD4.html
※ 编辑: jamod (60.249.2.10), 08/09/2016 10:34:40
1F:→ CindyLinz: 你的「能不能」包含 explicit 转型吗? 112.121.78.5 08/09 13:04
不包含好了@@,我其实只是比较好奇这段的语法是否合法?
因为我曾经因为const int**和 int**的问题被VC++的compiler婊过,
所以有点混乱...
※ 编辑: jamod (60.249.2.10), 08/09/2016 13:19:12
※ 编辑: jamod (60.249.2.10), 08/09/2016 13:22:25
2F:推 jeff7037: *&这样的写法能放到函式的引数。但这样 114.24.38.28 08/09 21:20
3F:→ jeff7037: 不行,可见Primer C++第7章函式271页。 114.24.38.28 08/09 21:23
4F:→ jeff7037: 第四章指标p121页。 114.24.38.28 08/09 21:25
5F:→ jeff7037: *&在函式里,意为对传来的引数deference 114.24.38.28 08/09 21:27
6F:→ jeff7037: 可理解为取值。然不可在定义式这样写*& 114.24.38.28 08/09 21:28
7F:推 jeff7037: 你有对*&赋值的动作。 114.24.38.28 08/09 21:30
感谢指点,但我还是有点小疑惑,以上方程式码而言:
int *pi;
const int*& rpci = pi;
虽然会出错,但是只要把第二行的const拿掉就能正确编译了,
实际上我应该就是单纯的对一个int pointer的别名进行初始化吧?@@
甚至写成
const int*const & rpci = pi;
也是能正确编译的,我不太能理解为何将要reference的pointer指定为const就能编译?
有点好奇是compiler鸡婆把我挡下的呢?还是在语法规则上就是不合法了?
※ 编辑: jamod (60.249.2.10), 08/10/2016 09:38:52
8F:推 shietsd: non-const reference只能用non-const绑定 219.84.235.190 10/16 15:46
9F:→ shietsd: 但con-ref可以绑所有的 const/non-const 219.84.235.190 10/16 15:47
10F:推 shietsd: const int &ci = i 表示 ci 不能改i的值 219.84.235.190 10/16 15:54
11F:→ shietsd: 但 i 自己可以改,你跑跑看就知道 219.84.235.190 10/16 15:54